使用python在XML中使用相同名称的不同元素时复制属性信息

时间:2013-01-30 20:58:43

标签: python xml elementtree

所以,这是我的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>

所以,你可以看到,“revisions”元素出现在两个不同的位置,在不同的级别。我的目标是达到属性“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

2 个答案:

答案 0 :(得分:1)

我也主要使用lxml,所以我不知道etree是什么,但它出现了 从树中查找不起作用,但从根查找确实有效:

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

另外:我不知道这只是一个错字,但是:

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

将给出一个SyntaxError:无效谓词

添加注意:tree.find( 'api' )似乎返回无,

tree.find( '.' )会返回<Element 'api' at 0x1004e5f10&gt;

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

也可以。

答案 1 :(得分:0)

这并不直接回答您的问题。但是,我会使用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,但似乎无法正常工作。