将一个 XML 标签插入另一个标签
Insert an XML tag into another another tag
我正在尝试使用 ElementTree 遍历 Python 中的一个 XML 文件,更改标签中的一个属性,然后将该标签插入到另一个文件中的另一个标签中,代码如下:
import xml.etree.ElementTree as ET
tree = ET.parse('original_file.xml')
root = tree.getroot()
cnt = 1
exact = ET.Element("eExact")
glentries = ET.SubElement(exact, "GLEntries")
glentry = ET.SubElement(glentries, "GLEntry", status="E", entry="194100751")
ET.SubElement(glentry, "DocumentDate").text = "31032019"
ET.SubElement(glentry, "Description").text = "TEST"
ET.SubElement(glentry, "Journal", code="41", type="M")
for child in root.iter('FinEntryLine'):
child.attrib["number"] = cnt
ET.SubElement(glentry, child)
cnt += 1
tree = ET.ElementTree(exact)
tree.write("output_file.xml")
但这不起作用,因为 ElemntTree 和 SubElement 报告它们无法序列化。有没有另一种方法,但我不必遍历 "child"?
的所有子标签
输入文件:
<eExact>
<GLEntries>
<GLEntry status="E" entry="194100751">
<DocumentDate>31032019</DocumentDate>
<Description>TEST</Description>
<Journal code="41" type="M"></Journal>
<FinEntryLine number="83932" type="N" subtype="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
<FinEntryLine number="98457" type="N" subtype="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
</GLEntry>
</GLEntries>
</eExact>
输出应该只是将数字标签更改为序列,从 1 开始。
如果您只想更改 <FinEntryLine>
元素的 number
属性,这就是所需的全部内容:
import xml.etree.ElementTree as ET
tree = ET.parse('original_file.xml')
cnt = 1
for child in tree.iter('FinEntryLine'):
child.attrib["number"] = str(cnt)
cnt += 1
tree.write("output_file.xml")
结果(output_file.xml):
<eExact>
<GLEntries>
<GLEntry entry="194100751" status="E">
<DocumentDate>31032019</DocumentDate>
<Description>TEST</Description>
<Journal code="41" type="M" />
<FinEntryLine number="1" subtype="N" type="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
<FinEntryLine number="2" subtype="N" type="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
</GLEntry>
</GLEntries>
</eExact>
我正在尝试使用 ElementTree 遍历 Python 中的一个 XML 文件,更改标签中的一个属性,然后将该标签插入到另一个文件中的另一个标签中,代码如下:
import xml.etree.ElementTree as ET
tree = ET.parse('original_file.xml')
root = tree.getroot()
cnt = 1
exact = ET.Element("eExact")
glentries = ET.SubElement(exact, "GLEntries")
glentry = ET.SubElement(glentries, "GLEntry", status="E", entry="194100751")
ET.SubElement(glentry, "DocumentDate").text = "31032019"
ET.SubElement(glentry, "Description").text = "TEST"
ET.SubElement(glentry, "Journal", code="41", type="M")
for child in root.iter('FinEntryLine'):
child.attrib["number"] = cnt
ET.SubElement(glentry, child)
cnt += 1
tree = ET.ElementTree(exact)
tree.write("output_file.xml")
但这不起作用,因为 ElemntTree 和 SubElement 报告它们无法序列化。有没有另一种方法,但我不必遍历 "child"?
的所有子标签输入文件:
<eExact>
<GLEntries>
<GLEntry status="E" entry="194100751">
<DocumentDate>31032019</DocumentDate>
<Description>TEST</Description>
<Journal code="41" type="M"></Journal>
<FinEntryLine number="83932" type="N" subtype="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
<FinEntryLine number="98457" type="N" subtype="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
</GLEntry>
</GLEntries>
</eExact>
输出应该只是将数字标签更改为序列,从 1 开始。
如果您只想更改 <FinEntryLine>
元素的 number
属性,这就是所需的全部内容:
import xml.etree.ElementTree as ET
tree = ET.parse('original_file.xml')
cnt = 1
for child in tree.iter('FinEntryLine'):
child.attrib["number"] = str(cnt)
cnt += 1
tree.write("output_file.xml")
结果(output_file.xml):
<eExact>
<GLEntries>
<GLEntry entry="194100751" status="E">
<DocumentDate>31032019</DocumentDate>
<Description>TEST</Description>
<Journal code="41" type="M" />
<FinEntryLine number="1" subtype="N" type="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
<FinEntryLine number="2" subtype="N" type="N">
<Description>01032019 GWPC 1900005105</Description>
</FinEntryLine>
</GLEntry>
</GLEntries>
</eExact>