使用Python转换xml数据

2024-09-28 20:57:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大量的xml数据。格式如下:

  <person>
        <name>Tom</name>
        <age>18</age>
        <address> London, xxx street, xxx building</address>
  </person>
  <person>
        <name>John</name>
        <age>22</age>
        <address> Canberra, xxx street, xxx building, xxx floor, xxx room,
                 xxx  bed</address>
  </person>

注意地址!在

我想得到以下结果:

^{pr2}$

数据相当大,我希望我可以逐行读取,这样就不会有内存问题。谢谢。在


Tags: 数据namestreetageaddress格式xmljohn
3条回答

首先,您的xml无效:

  • \(反斜杠)在xml标记中
  • <person>标记未关闭

解决上述问题后。
您的问题可以通过xpath模块提供的xpath来解决。
顺便说一句,有一个名为xmlstarlet的命令行工具:

$ xmlstarlet sel -t -m '//person' -v 'normalize-space(concat(name, "^", age, "^", address))' -n input.xml
Tom^18^ London, xxx street, xxx building
John^22^ Canberra, xxx street, xxx building, xxx floor, xxx room, xxx bed

如果有可用的xml库,不要通过解析字符串来折磨自己——例如lxml。如果你想继续使用python的电池,那么看看dom.minidom。在

请确保输入是格式正确的xml。在

要处理内存有限的大型xml文件,可以使用^{}

#!/usr/bin/env python
import xml.etree.cElementTree as etree

def getelements(source, tag):
    context = iter(etree.iterparse(source, events=('start', 'end')))
    _, root = next(context) # get root element
    for event, elem in context:
        if event == 'end' and elem.tag == tag:
            yield elem
            root.clear() # free memory

for elem in getelements('big.xml', 'person'):
    print '^'.join(elem.find(tag).text for tag in 'name age address'.split())

您可以为标记内的多行文本添加特殊处理(如您的示例address),例如,您可以使用re.sub(r'\s+', ' ', text)来规范化空白。在

Output

^{pr2}$

如果输入xml可能包含'^',并且希望对其进行转义,那么可以使用^{} module生成输出。在

相关问题 更多 >