python - 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>
标签。我的代码应该改变什么来实现这一点?
解决方案
替换这个:
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 元素中,然后写入主元素(其所有子元素都自动写入)。
推荐阅读
- python - 如何使用 Scikit-Learn 和 Python 找到最佳集群数量
- android -
无法选择任何模拟器来运行代码 - node.js - 如何使用两个不同的节点版本运行两个不同的 nodejs 应用程序
- linux - Linux“猫”如何解码文件?
- c# - 使用 .NET 从公钥字节进行 RSA/ECB/PKCSPadding1 加密
- javascript - 无法使用 Highcharts 创建折线图 - Vue.js
- azure - Azure APIM 是否支持 405(不允许的方法)状态码?
- css - 遮罩图像css,使其仅显示圆圈的一部分
- javascript - javascript Uncaught (in promise) DOMException
- javascript - 未捕获(承诺):错误:运行时编译器未在 Angular 中加载