Python 基于属性查找xml元素并更改其值

Python 基于属性查找xml元素并更改其值,python,xml,xml-parsing,Python,Xml,Xml Parsing,我正在使用python xmlElementTree,并希望根据其属性分配或修改xml元素值。有人能告诉我怎么做吗 例如:这是一个xml文件,我需要根据属性“sys/phoneNumber/1”、“sys2/SMSnumber/1”等设置元素“number”的值 <root> <phoneNumbers> <number topic="sys/phoneNumber/1" update="none" /> <num

我正在使用python xmlElementTree,并希望根据其属性分配或修改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文件中的标记根添加了闭包。

我不熟悉
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    '
>>将lxml.etree导入为etree
>>>doc=etree.parse('foo.xml')
>>>nodes=doc.xpath(“//number[@topic=“sys/phoneNumber/1”]”)
>>>节点
[]
>>>etree.tostring(节点[0])
“\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)

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

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

larsks解释了如何使用XPath很好地找到您想要的内容。您还想更改一个属性。最好的方法可能是添加新属性并删除原始属性。一旦得到节点结果,它就是一个带有单个条目(编号)的列表

希望这有帮助


此外,您的结束根标记未正确关闭。

对于我来说,此Elementtree截取的代码用于按属性查找元素:

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


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

您演示了如何定位元素和修改属性,但他问如何修改元素。我认为您的最后一行应该是:tag.text='new value'是的,我没有修改元素的值…创建一个新的标记并赋值:
tag.text='new value'
或修改元素值:
node.text='new value'
如果我想使用xml文件作为输入而不是文本怎么办?您可以读取文件:
f=open('file.xml'))
;将所有文本读入一个变量:
text=f.Read()
;然后关闭文件:
f.close()
# This returns sys/phoneNumber/1
nodes[0].get("topic")
# To change the value, use set 
nodes[0].set("topic", "new/value/of/phone/number")
import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()


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