[英]How to update existing xml element with new given element using python?
我輸入了 XML 作為 country.xml:-
<root>
<set>
<name>Countries</name>
<elements>
<name>US</name>
<city>
<val>New York</val>
<val>Las Vegas</val>
</city>
</elements>
<elements>
<name>UK</name>
<city>
<val>London</val>
</city>
</elements>
</set>
</root>
我正在解析 xml 並將其放入一個列表中,並且我有一個字典,我正在根據該字典比較和添加 xml 元素。
diction: dict = {'US':['New York', 'Chicago'], 'UK':['OXFORD', 'London']}
source = etree.getroot()
for key,value in diction.items()
countrylist = source.xpath('./elements/name[text()=\'{}\']/..'.format(key))
if len(countrylist) == 0:
# creating new string and element
# appending element to original tree
elif len(countrylist) == 1: ###This is problematic case what to expect here to update key,value from dictionary only and replace the tag already present in xml
key = countrylist[0]
else:
countinue
# writebacktoxml(source,"country.xml")
我得到的輸出是原始輸入條件,因為它是特定條件的輸出。 預期輸出如下:-
<root>
<set>
<name>Countries</name>
<elements>
<name>US</name>
<city>
<val>New York</val>
<val>Chicago</val>
</city>
</elements>
<elements>
<name>UK</name>
<city>
<val>OXFORD</val>
<val>London</val>
</city>
</elements>
</set>
</root>
評論:如果
diction:{'AUSTRALIA': ['MELBOURNE']}
呢? 我想將字典中的內容以及輸入 xml 中的內容保留到輸出 xml 中?
在.clear
周圍添加條件
if name.text in ['AUSTRALIA']: # Keep the values pass else: table_category.clear()
問題:如何使用新的給定
<val>...</val>
更新現有的 xml 元素?
文檔: lxml.etree 教程 - E-factory
Python 文檔 - ElementTree XML API - 修改 XML 文件
使用lxml
示例
from lxml import etree from lxml.builder import ElementMaker
數據dict
diction = {'US': ['New York', 'Chicago'], 'UK': ['OXFORD', 'London']}
實例化一個ElementMaker
對象和一個新的<val>...</val>
對象。
E = ElementMaker() VAL = E.val
解析源xml
tree = etree.parse(io.StringIO(xmlf)) root = tree.getroot()
解析所有set/elements
for element in root.findall('set/elements'):
獲取此element
的name
name = element.find('name')
獲取該element
的table_category
並.clear
它
table_category = element.find('table_category') table_category.clear()
循環從所有項目list
中的diction
的定義[name.text]
for val in diction[name.text]:
將新的<val>val</val>
附加到table_category
table_category.append(VAL(val))
輸出:
print('{}'.format(etree.tostring(root, pretty_print=True).decode()))
<configroot version="8.0"> <set> <name>Countries</name> <elements> <name>US</name> <table_category><val>New York</val><val>Chicago</val></table_category></elements> <elements> <name>UK</name> <table_category><val>OXFORD</val><val>London</val></table_category></elements> </set> </configroot>
用 Python 測試:3.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.