[英]Inserting nodes into XML using python element tree
我有以下XML結構,如果在某個特定位置不存在,我想添加一個新節點。
<root>
<OuterLevel>
<Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
我用元素樹寫了一個python腳本。 http://docs.python.org/library/xml.etree.elementtree.html
import xml.etree.ElementTree as ET
tree = ET.parse('sampleFile.xml')
root = tree.getroot()
newNodeStr = 'NewNode'
if root[0][0].tag != newNodeStr :
print('Now we add it')
newNode = ET.Element(newNodeStr)
newNodeName = ET.Element('Name')
newNodeName.text = 'NodeC'
newNode.append(newNodeName)
root[0].insert(0, newNode)
tree.write('sampleFileNew.xml')
我希望XML結構看起來像這樣:
<root>
<OuterLevel>
<NewNode>
<Name>NodeC</Name>
</NewNode>
<Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
但相反,它看起來像這樣:
<root>
<OuterLevel>
<NewNode><Name>NodeC</Name></NewNode><Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
我使用了元素樹中的insert()方法,因為我認為它會給我我需要的東西,即在特定位置插入一個節點。 但是,看起來insert()實際上並不關心樹結構中該位置的內容。 有沒有一種方法可以用來修復排序? 有沒有更好的方法呢?
從語法上講,這兩個輸出是相同的,如果你保存文件然后重新解析它,tree.write()可能會按照你想要的方式打印你的輸出,雖然我不確定。
試試這個,它會很好地打印出你想要的輸出。
try:
reparsed = mini.parseString(mini.parse('YOUR_FILE_NAME').toxml())
pretty_string = '\n'.join([line for line in reparsed.toprettyxml(indent=' '*4).split('\n') if line.strip()])
f = open('YOUR_FILE_NAME', 'w')
f.write(pretty_string)
finally:
f.close()
當您將樹重寫到文件時,您可能需要使用pretty_print = True。 也許您正在使用之前的pretty_print格式解析它,但insert()不會以pretty_print格式添加新節點。
如果您沒有使用LXML,我不確定這是否可行,但只需將打印更改為:
tree.write('sampleFileNew.xml',pretty_print = True)
同樣,您可能需要導入lxml才能使用此功能。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.