从XML文档获取数据并使用python将其写入另一个XML文档

时间:2014-08-04 08:30:42

标签: python xml

我已经尝试了一段时间来做这件事。

基本上,我有一个以下格式的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文件中获取IDlatitudelongitude的值并将整个新文档写入新的XML文件时,我的问题出现了{ {1}}也是为了更容易阅读。我根本无法把它弄出来。一些提示将不胜感激。

2 个答案:

答案 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.etreexml.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