根据xml元素的属性查找并更改其值

2024-09-23 08:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pythonxmlementtree,并希望基于其属性分配或修改xml元素值。有人能告诉我怎么做吗?

例如:这里有一个xml文件,我需要根据属性“sys/phoneNumber/1”、“sys2/SMSnumber/1”等设置元素“number”的值。

<root>
    <phoneNumbers>
        <number topic="sys/phoneNumber/1" update="none" />
        <number topic="sys/phoneNumber/2" update="none" />
        <number topic="sys/phoneNumber/3" update="none" />
    </phoneNumbers>

    <gfenSMSnumbers>
        <number topic="sys2/SMSnumber/1" update="none" />
        <number topic="sys2/SMSnumber/2" update="none" />
    </gfenSMSnumbers>
</root>

编辑:为XML文件中的标记根添加了闭包。


Tags: 文件none元素numbertopic属性sysupdate
3条回答

对我来说,这个元素树截取的代码是用来按属性查找元素的:

import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()


topic=root.find(".//*[@topic='sys/phoneNumber/1']").text

我不熟悉xmlElementTree,但是如果您使用的是能够xpath表达式的东西,则可以使用如下表达式按属性值查找节点:

//number[@topic="sys/phoneNumber/1"]

因此,使用etree模块:

>>> import lxml.etree as etree
>>> doc = etree.parse('foo.xml')
>>> nodes = doc.xpath('//number[@topic="sys/phoneNumber/1"]')
>>> nodes
[<Element number at 0x10348ed70>]
>>> etree.tostring(nodes[0])
'<number topic="sys/phoneNumber/1" update="none"/>\n    '

您可以这样访问属性值:

from elementtree.ElementTree import XML, SubElement, Element, tostring

text = """
<root>
    <phoneNumbers>
        <number topic="sys/phoneNumber/1" update="none" />
        <number topic="sys/phoneNumber/2" update="none" />
        <number topic="sys/phoneNumber/3" update="none" />
    </phoneNumbers>

    <gfenSMSnumbers>
        <number topic="sys2/SMSnumber/1" update="none" />
        <number topic="sys2/SMSnumber/2" update="none" />
    </gfenSMSnumbers>
</root>
"""

elem = XML(text)
for node in elem.find('phoneNumbers'):
    print node.attrib['topic']
    # Create sub elements
    if node.attrib['topic']=="sys/phoneNumber/1":
        tag = SubElement(node,'TagName')
        tag.attrib['attr'] = 'AttribValue'

print tostring(elem)

忘了说,如果ElementTree版本大于1.3,可以使用XPath:

elem.find('.//number[@topic="sys/phoneNumber/1"]')

http://effbot.org/zone/element-xpath.htm

或者你可以用这个简单的:

for node in elem.findall('.//number'):
    if node.attrib['topic']=="sys/phoneNumber/1":
        tag = SubElement(node,'TagName')
        tag.attrib['attr'] = 'AttribValue'

相关问题 更多 >