在Python中将数据添加到现有XML中

时间:2014-04-22 15:40:58

标签: python xml parsing

我必须解析一个xml文件&使用Python修改特定标记中的数据。我正在使用Element Tree来做到这一点。我能够解析&达到所需的标签。但我无法修改该值。我不确定Element Tree是否合适,或者我是否应该使用TreeBuilder。

如下所示,我只是想用字符串值替换判决下的未执行。

-<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()

我相信我的做法是错误的。请用正确的指针指导我。 感谢。

3 个答案:

答案 0 :(得分:1)

您最好切换到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>

答案 1 :(得分:0)

试试这个

import xml.etree.ElementTree as et

root=et.parse(xmldata).getroot()
s=root.find('Verdict')
s.text='Your string'

答案 2 :(得分:0)

这是使用ElementTree的解决方案。见Modifying an XML File

import xml.etree.ElementTree as et


tree = et.parse('prison.xml')
root = tree.getroot()
print root.find('Verdict').text #before update
root.find('Verdict').text = 'Executed'

tree.write('prison.xml')