我必须使用 Python 解析 xml 文件并修改特定标记中的数据。我正在使用元素树来做到这一点。我能够解析并达到所需的标签。但我无法修改该值。我不确定 Element Tree 是否可以,或者我是否应该使用 TreeBuilder 来实现此目的。
正如您在下面看到的,我只想将 Verdict 下的“Not Executed”替换为字符串值。
-<Procedure>
<PreCondition>PRECONDITION: - ECU in extended diagnostic session (zz = 0x03) </PreCondition>
<PostCondition/>
<ProcedureID>428495</ProcedureID>
<SequenceNumber>2</SequenceNumber>
<CID>-1</CID>
<**Verdict** Writable="true">NotExecuted</Verdict>
</Procedure>
import xml.etree.ElementTree as etree
X_tree = etree.parse('DIAGNOSTIC SERVER.xml')
X_root = X_tree.getroot()
ATC_Name = X_root.iterfind('TestOrder//TestOrder//TestSuite//')
try:
while(1):
temp = ATC_Name.next()
if temp.tag == 'ProcedureID' and temp.text == str(TestCase_Id[j].text).split('-')[1]:
ATC_Name.next()
ATC_Name.next()
ATC_Name.next().text = 'Pass' <--This is what I want to do
ATC_Name.close()
break
except:
print sys.exc_info()
我相信我的方法是错误的。请用正确的指点指导我。 谢谢。
最佳答案
您最好切换到lxml这样您就可以使用 xpath
的“无限”力量。
这个想法是使用以下xpath
表达式:
//Procedure[ProcedureID/text()="%d"]/Verdict
其中 %d
占位符通过 string formatting operation 替换为适当的过程 ID .
xpath 表达式找到适当的 Verdict
标记,您可以在其上设置 text
:
from lxml import etree
data = """<Procedure>
<PreCondition>PRECONDITION: - ECU in extended diagnostic session (zz = 0x03) </PreCondition>
<PostCondition/>
<ProcedureID>428495</ProcedureID>
<SequenceNumber>2</SequenceNumber>
<CID>-1</CID>
<Verdict Writable="true">NotExecuted</Verdict>
</Procedure>"""
ID = 428495
tree = etree.fromstring(data)
verdict = tree.xpath('//Procedure[ProcedureID/text()="%d"]/Verdict' % ID)[0]
verdict.text = 'test'
print etree.tostring(tree)
打印:
<Procedure>
<PreCondition>PRECONDITION: - ECU in extended diagnostic session (zz = 0x03) </PreCondition>
<PostCondition/>
<ProcedureID>428495</ProcedureID>
<SequenceNumber>2</SequenceNumber>
<CID>-1</CID>
<Verdict Writable="true">test</Verdict>
</Procedure>
关于python - Reg 将数据添加到 Python 中的现有 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23224088/