首页 > 解决方案 > XML 中缺少包装器

问题描述

我正在尝试将特定数据从一个大 XML 拉到另一个。我的主要 XML 文件如下所示

<MAIN>
<transaction>
        <date>20190415</date>
        <ticket>1</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>2</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>3</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>4</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>5</ticket>
        <value>15</value>
</transaction>
</MAIN>

我只是在提取<ticket>值并将其附加到新鲜/新的 xml 文件中。

下面是我的代码

import pandas as pd
import xml.etree.ElementTree as ET
from lxml import etree

path_source = 'source\path'
path_dest =  'dest\path'

tree = ET.parse(path_source)
root = tree.getroot()

L_roots = []

for trx in root.iter('transaction'):
    ticket = trx.find('ticket').text

    root_T = ET.Element('MAIN')
    doc = ET.SubElement(root_T, 'Transaction')

    ET.SubElement(doc, 'ticket').text = ticket

    L_roots.append(doc)

with open(path_dest,'wb') as f:
    for i in L_roots:
        ET.Element('MAIN')
        f.write(ET.tostring(i, method="xml"))

我得到的是一个没有外部<MAIN>标签的纯文本文件。像下面

<Transaction>
    <ticket>1</ticket>
</Transaction>
<Transaction>
    <ticket>2</ticket>
</Transaction>
<Transaction>
    <ticket>3</ticket>
</Transaction>
<Transaction>
    <ticket>4</ticket>
</Transaction>
<Transaction>
    <ticket>5</ticket>
</Transaction>

这里缺少的是包装<MAIN>标签。我的代码应该改变什么来实现这一点?

标签: pythonxmlpandas

解决方案


替换这个:

with open(path_dest,'wb') as f:
    for i in L_roots:
        ET.Element('MAIN')
        f.write(ET.tostring(i, method="xml"))

有了这个:

outroot = ET.Element('MAIN')
outroot.extend(L_roots)

with open(path_dest,'wb') as f:
    f.write(ET.tostring(outroot, method="xml"))

您的代码段中的错误是您从未将新内容保存ET.Element('MAIN')到变量中,因此丢失了。使用时,f.write您只需在L_roots具有 Transaction 标签的元素中编写元素。

在我建议的片段中,所有L_roots元素都插入到另一个 MAIN 元素中,然后写入主元素(其所有子元素都自动写入)。


推荐阅读