我已经尝试了一段时间来做这件事。
基本上,我有一个以下格式的XML文档(其中包含我需要的信息 - 某些点的ID和坐标):
<root>
<!-- Title element missing here -->
<Table>
<Point>
<ID>Point1</ID>
<latitude>numbers</latitude>
<longitude>numbers</longitude>
</Point>
</Table> <!-- This line should be eliminated -->
<Table> <!-- This line should be eliminated -->
<Point>
<ID>Point2</ID>
<latitude>numbers</latitude>
<longitude>numbers</longitude>
</Point>
</Table>
</root>
我需要做的是获取此文档并以不同的格式输出(如上所示,在原始XML文件中),而不更改原始XML文件。
我为上述任务编写了以下代码,但我可以说是砖墙。我也是python的新手。
from lxml import etree
import xml.etree.ElementTree as ET
doc=etree.parse('test2.xml')
root=doc.getroot()
elements=root.findall(".//Point")
root=ET.Element('root')
title=ET.SubElement(root,'Title')
title.text="Title"
table=ET.SubElement(root,'Table')
for element in elements:
point=ET.SubElement(table,'Point')
elem=ET.SubElement(point,'ID')
elem.text="Name"
elem2=ET.SubElement(point,'latitude')
elem2.text="coords"
elem3=ET.SubElement(point,'longitude')
elem3.text="coords"
ET.dump(root) # using ET.dump just to display the output in the python SHELL
上面的代码在SHELL中给出了以下输出,这就是我需要的。
<root>
<Title>Title</Title>
<Table>
<Point>
<ID>Name</ID>
<latitude>coords</latitude>
<longitude>coords</longitude>
</Point>
<Point>
<ID>Name</ID>
<latitude>coords</latitude>
<longitude>coords</longitude>
</Point>
</Table>
</root>
当我必须从原始XML文件中获取ID
,latitude
和longitude
的值并将整个新文档写入新的XML文件时,我的问题出现了{ {1}}也是为了更容易阅读。我根本无法把它弄出来。一些提示将不胜感激。
答案 0 :(得分:0)
如果您只想从原始XML复制Point元素,您可以这样做:
from copy import deepcopy
for element in elements:
table.append(deepcopy(element))
如果您想以某种方式操纵值,可以迭代元素:
point=ET.SubElement(table,'Point')
for subelement in element:
elem = ET.SubElement(point, subelement.tag)
if elem.tag == 'ID':
elem.text = dowhatyouwantwith(subelement.text)
elif ....
另外,您是否真的需要同时使用lxml.etree
和xml.etree
?你为什么不选择其中一个并坚持下去?
答案 1 :(得分:0)
您可以使用ET.write()
和xml.dom.minidom
来实现您的目标。
(考虑到我们不使用lxml
并仅使用标准Python的ElementTree)
只需扩展您的代码:
import xml.etree.ElementTree as ET
import xml.dom.minidom
doc=ET.parse('test2.xml')
root=doc.getroot()
elements=root.findall(".//Point")
root=ET.Element('root')
title=ET.SubElement(root,'Title')
title.text="Title"
table=ET.SubElement(root,'Table')
for element in elements:
point=ET.SubElement(table,'Point')
elem=ET.SubElement(point,'ID')
elem.text="Name"
elem2=ET.SubElement(point,'latitude')
elem2.text="coords"
elem3=ET.SubElement(point,'longitude')
elem3.text="coords"
ET.dump(root) # using ET.dump just to display the output in the python SHELL
tree = ET.ElementTree(root)
tree.write('test3.xml') # This is enough but not yet pretty-print
# Using xml.dom.minidom to parse the non-pretty file to make it pretty
a = xml.dom.minidom.parse('test3.xml')
pretty_xml_as_string = a.toprettyxml()
with open('test3.xml', 'w') as f:
f.write(pretty_xml_as_string) # Write again in pretty-print format