use*_*251 8 python xml xml-parsing
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
编辑:为XML文件中的标记根添加了闭包.
foc*_*art 14
您可以像这样访问属性值:
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)
Run Code Online (Sandbox Code Playgroud)
忘了说,如果你的ElementTree版本大于1.3,你可以使用XPath:
elem.find('.//number[@topic="sys/phoneNumber/1"]')
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
对我来说,这个 Elementtree 代码片段用于按属性查找元素:
import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()
topic=root.find(".//*[@topic='sys/phoneNumber/1']").text
Run Code Online (Sandbox Code Playgroud)
我不熟悉xmlElementTree,但如果您使用的是能够xpath表达的东西,您可以使用如下表达式通过属性值定位节点:
//number[@topic="sys/phoneNumber/1"]
Run Code Online (Sandbox Code Playgroud)
因此,使用该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 '
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34424 次 |
| 最近记录: |