插入 XML Value/Element 和 Python
Insert XML Value/Element with Python
我一直在寻找将 element/value 添加到当前 XML 文件的解决方案。因此,假设我有以下 XML 文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
</Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
</Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
</Node>
</Root>
现在,我的目标是,给定一个 CSV 文件,我想为每个节点添加新元素和值。假设我的 CSV 包含如下内容:
Cloudy,Or,Sprinkler,Rain
Sprinkler,And,Rain
Rain,Or,Sprinkler,Cloudy
我能够毫无问题地读取 CSV,我的问题是添加新元素,'Parent0' 和 'Parent1'(如果有),因此输出如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
<Gate>And</Gate>
<Parent0>Rain</Parent0>
</Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
<Gate>Or</Gate>
<Parent0>Sprinkler</Parent0>
<Parent1>Cloudy</Parent1>
</Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
<Gate>Or</Gate>
<Parent0>Sprinkler</Parent0>
<Parent1>Rain</Parent1>
</Node>
</Root>
到目前为止我在Python中写了以下内容:
import xml.etree.ElementTree as ET
xml = ET.parse('XML.xml')
for row in xml.iterfind('Node'):
i = 1
for item in csvFile:
row.append('<Gate>'+item[1]+'</Gate>\n')
if i != 1:
for x in xrange(0, len(item):
if row.findtext('Name') == item[x]:
row.append('<Parent0>'+item[x]+'</Parent0>\n')
else:
i = 0
在我的代码中,它现在全部转到 Parent0,但我想看看如何在不删除所有内容的情况下进行追加?我听说过 lxml 和 minidom,但不确定它们是如何工作的。如果我能够使用 xml.etree.ElementTree 做到这一点,那就太棒了。
一个简单的方法是使用 ElementTree.SubElement()
创建元素,它会自动将这些元素添加到父节点的末尾,父节点作为参数传入。
Example/Demo -
>>> import xml.etree.ElementTree as ET
>>> import csv
>>> with open('test.csv','r') as f:
... cfiles = list(csv.reader(f))
...
>>> xml = ET.parse('XML.xml')
>>> for row in xml.iterfind('.//Node'):
... name = row.find('./Name').text
... for i in cfiles:
... if i[0] == name:
... j = 1
... while j < len(i):
... if j == 1:
... g = ET.SubElement(row,'Gate')
... g.text = i[j]
... elif j == 2:
... g = ET.SubElement(row,'Parent0')
... g.text = i[j]
... elif j == 3:
... g = ET.SubElement(row,'Parent1')
... g.text = i[j]
... j += 1
...
>>> print(ET.tostring(xml.getroot()).decode())
<Root>
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
<Gate>And</Gate><Parent0>Rain</Parent0></Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
<Gate>Or</Gate><Parent0>Sprinkler</Parent0><Parent1>Cloudy</Parent1></Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
<Gate>Or</Gate><Parent0>Sprinkler</Parent0><Parent1>Rain</Parent1></Node>
</Root>
在上面,cfiles
是我之前从 csv 文件创建的列表。
要将 xml 写入新文档,请执行 -
with open('newxml.xml','w') as of:
of.write(ET.tostring(xml.getroot()).decode())
我一直在寻找将 element/value 添加到当前 XML 文件的解决方案。因此,假设我有以下 XML 文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
</Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
</Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
</Node>
</Root>
现在,我的目标是,给定一个 CSV 文件,我想为每个节点添加新元素和值。假设我的 CSV 包含如下内容:
Cloudy,Or,Sprinkler,Rain
Sprinkler,And,Rain
Rain,Or,Sprinkler,Cloudy
我能够毫无问题地读取 CSV,我的问题是添加新元素,'Parent0' 和 'Parent1'(如果有),因此输出如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
<Gate>And</Gate>
<Parent0>Rain</Parent0>
</Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
<Gate>Or</Gate>
<Parent0>Sprinkler</Parent0>
<Parent1>Cloudy</Parent1>
</Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
<Gate>Or</Gate>
<Parent0>Sprinkler</Parent0>
<Parent1>Rain</Parent1>
</Node>
</Root>
到目前为止我在Python中写了以下内容:
import xml.etree.ElementTree as ET
xml = ET.parse('XML.xml')
for row in xml.iterfind('Node'):
i = 1
for item in csvFile:
row.append('<Gate>'+item[1]+'</Gate>\n')
if i != 1:
for x in xrange(0, len(item):
if row.findtext('Name') == item[x]:
row.append('<Parent0>'+item[x]+'</Parent0>\n')
else:
i = 0
在我的代码中,它现在全部转到 Parent0,但我想看看如何在不删除所有内容的情况下进行追加?我听说过 lxml 和 minidom,但不确定它们是如何工作的。如果我能够使用 xml.etree.ElementTree 做到这一点,那就太棒了。
一个简单的方法是使用 ElementTree.SubElement()
创建元素,它会自动将这些元素添加到父节点的末尾,父节点作为参数传入。
Example/Demo -
>>> import xml.etree.ElementTree as ET
>>> import csv
>>> with open('test.csv','r') as f:
... cfiles = list(csv.reader(f))
...
>>> xml = ET.parse('XML.xml')
>>> for row in xml.iterfind('.//Node'):
... name = row.find('./Name').text
... for i in cfiles:
... if i[0] == name:
... j = 1
... while j < len(i):
... if j == 1:
... g = ET.SubElement(row,'Gate')
... g.text = i[j]
... elif j == 2:
... g = ET.SubElement(row,'Parent0')
... g.text = i[j]
... elif j == 3:
... g = ET.SubElement(row,'Parent1')
... g.text = i[j]
... j += 1
...
>>> print(ET.tostring(xml.getroot()).decode())
<Root>
<Node>
<Name>Sprinkler</Name>
<Type>Blah</Type>
<Prob>0.82</Prob>
<Gate>And</Gate><Parent0>Rain</Parent0></Node>
<Node>
<Name>Rain</Name>
<Type>Bleh</Type>
<Prob>0.23</Prob>
<Gate>Or</Gate><Parent0>Sprinkler</Parent0><Parent1>Cloudy</Parent1></Node>
<Node>
<Name>Cloudy</Name>
<Type>Bluh</Type>
<Prob>0.71</Prob>
<Gate>Or</Gate><Parent0>Sprinkler</Parent0><Parent1>Rain</Parent1></Node>
</Root>
在上面,cfiles
是我之前从 csv 文件创建的列表。
要将 xml 写入新文档,请执行 -
with open('newxml.xml','w') as of:
of.write(ET.tostring(xml.getroot()).decode())