【问题标题】:Copy attribute information when different element have the same name in XML with python使用python在XML中具有相同名称的不同元素时复制属性信息
【发布时间】:2013-01-30 20:58:43
【问题描述】:

所以,这是我的 XML 树:

<?xml version="1.0"?>
<api>
    <query>
        <normalized>
            <n from="Brain_cancer" to="Brain cancer" />
        </normalized>
        <redirects>
            <r from="Brain cancer" to="Brain tumor" 
            />
        </redirects>
        <pages>
            <page pageid="37284" ns="0" title="Brain tumor">
                <revisions>
                    <rev revid="412658600" parentid="412501243" user="Andycjp" userid="55014" timestamp="2011-02-08T03:35:27Z" size="59870" sha1="fe1ff25c27ebc86572aa4be8201cb813e1bf3d32" comment="/* Psychological and behavioral consequences */"  contentformat="text/x-wiki" contentmodel="wikitext" xml:space="preserve">
                    </rev>
                </revisions>
            </page>
        </pages>
    </query>
    <warnings>
        <revisions xml:space="preserve">
        </revisions>
        <result xml:space="preserve">
        </result>
    </warnings>
    <query-continue>
        <revisions rvcontinue="456175380" 
        />
    </query-continue>
</api>

那么,您是否可以看到,“修订”元素出现在两个不同的地方,不同的级别。我的目标是达到属性“rvcontinue”(谁的路径是 api/query-continue/revisions)以将其值复制到一个新变量中。这可能是因为我没有做对,但 elementTree 和 xpath 到目前为止还没有工作。

这是我迄今为止所做的,但它没有得到任何地方

import xml.etree.ElementTree as ET
tree = ET.parse('Brain_tumor_5.xml')

for elem in tree.getiterator():
    if elem.tag=='{http://www.namespace.co.uk}query-continue':
        output = {}
        for elem1 in list(elem):
            if elem1.tag=='{http://www.namespace.co.uk}revisions':
                output['rvcontinue']=elem1.text
        print output

p = tree.find("./api/query-continue/revisions[@rvcontinue=]")
q = p.attrib
print q

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    我也主要使用lxml,所以我不知道etree是怎么回事,但它似乎 从树中查找不起作用,但从根中查找确实起作用:

    >>> tree.getroot().find( 'query-continue/revisions[@rvcontinue]' ).attrib['rvcontinue']
    '456175380'
    

    另外:我不知道是不是上面的错字,但是:

    p = tree.find("./api/query-continue/revisions[@rvcontinue=]")
    

    会给出一个 SyntaxError: invalid predicate

    补充说明:tree.find( 'api' ) 似乎返回 None,

    但是tree.find( '.' ) 返回&lt;Element 'api' at 0x1004e5f10>

    所以tree.find( './query-continue/revisions[@rvcontinue]' )

    也可以。

    【讨论】:

      【解决方案2】:

      这并不能直接回答您的问题。但是,我会使用lxml.etree(据说它提供了相同的ElementTree 接口)和以下代码:

      >>> import lxml.etree
      >>> doc = lxml.etree.parse('doc.xml')
      >>> node = doc.xpath('/api/query-continue/revisions[@rvcontinue]')
      >>> node[0].attrib['rvcontinue']
      '456175380'
      

      尝试使用xml.etree.ElementTree,但似乎不起作用。

      【讨论】:

      • 我将您的 XML 文件复制到 doc.xml... 显然,更改以匹配您的环境。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多