我是python的新手,我需要修改
<test name="test02"></xmpp> to <test name="test03"></xmpp>
<temp-config>QA</temp-config> to <temp-config>Prod</temp-config>
使用python进行所有5次。 不确定使用什么lib。任何帮助都非常感谢。
<config>
<logging></logging>
<test-mode>false</test-mode>
<test name="test02"></xmpp>
<mail></mail>
<test-system>0</test-system>
<system id="0" name="suite1" type="regression">
<temp-config>QA</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="1" name="suite2" type="regression">
<temp-config>QA</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="2" name="suite3" type="regression">
<temp-config>QA</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="3" name="suite4" type="regression">
<temp-config>QA</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="4" name="suite5" type="regression">
<temp-config>QA</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
</config>
答案 0 :(得分:2)
ElementTree
是一个很好的选择 - 纯Python并包含在标准库中,因此它是最便携的选项。但是,我总是直接进入lxml
- 它具有相同的API,它只是更快,它可以做更多(因为它实际上是libxml2
的包装。)
from lxml import etree
tree = etree.parse(path_to_my_xml)
for elem in tree.findall('.//test'):
assert elem.attrib['name'] == 'test02'
elem.attrib['name'] == 'test03'
for elem in tree.findall('.//temp-config'):
assert elem.text == 'QA'
elem.text = 'Prod'
with open(path_to_output_file, 'w') as file_handle:
file_handle.write(etree.tostring(tree, pretty_print=True, encoding='utf8'))
答案 1 :(得分:2)
使用lxml。此示例使用lxml.etree
并且实际上会在您的示例xml上失败,因为它中包含一些未关闭的标记。如果您要解析的实际数据存在同样的问题,请使用可以处理损坏的xml的lxml.html,
(指令添加到代码中作为注释)。
In [14]: import lxml.etree as et # for broken xml add an import:
# import lxml.html as lh
In [15]: doc = et.fromstring(xmlstr) # for broken xml replace this line with:
# doc = lh.fromstring(xmlstr)
# if you read xml from a file:
# doc = et.parse('file_path')
In [16]: for elem in doc.xpath('.//temp-config'):
...: elem.text = 'Prod'
...:
In [17]: print et.tostring(doc,pretty_print=True)
<config>
<logging/>
<test-mode>false</test-mode>
<test name="test02">
<mail/>
<test-system>0</test-system>
<system id="0" name="suite1" type="regression">
<temp-config>Prod</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="1" name="suite2" type="regression">
<temp-config>Prod</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="2" name="suite3" type="regression">
<temp-config>Prod</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="3" name="suite4" type="regression">
<temp-config>Prod</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
<system id="4" name="suite5" type="regression">
<temp-config>Prod</temp-config>
<rpm>0.5</rpm>
<cycles>3</cycles>
</system>
</test>
</config>
注意:正如其他人所指出的,标准库中有一些不那么强大的替代品。对于简单的任务,它们可能非常适合,但是,如果您的xml文件被破坏,使用标准库工具解析它们等于浪费您的时间。
答案 2 :(得分:0)
我建议使用ElementTree:http://docs.python.org/2/library/xml.etree.elementtree.html
示例:
for atype in e.findall('type')
print(atype.get('foobar'))
答案 3 :(得分:0)
要完成上述答案,请使用lxml,以下是更改'name'属性值的方法:
from lxml import etree
tree = etree.parse(path_to_my_xml)
for elem in tree.xpath('.//temp-config'):
elem.text = 'Prod'
for elem in tree.xpath(".//test[@name='test02']"):
elem.attrib['name'] = 'test03'