python - 将大 xml 拆分为多个小 xml 文件
问题描述
这是books.xml,其中包含书籍的所有信息。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Book>
<Name>
Book1
</Name>
<Price>
USD.10.00
</Price>
</Book>
<Book>
<Name>
Book2
</Name>
<Price>
USD.15.40
</Price>
</Book>
<Book>
<Name>
Book3
</Name>
<Price>
USD.435.90
</Price>
</Book>
<Book>
<Name>
Book1
</Name>
<Price>
EUR.15.40
</Price>
</Book>
<Book>
<Name>
Book2
</Name>
<Price>
EUR.66.40
</Price>
</Book>
<Book>
<Name>
Book1
</Name>
<Price>
GBP.10.20
</Price>
</Book>
</root>
使用给定的books.xml,我希望它根据货币生成多个xml文件
我想要的输出
USD_books.xml
<?xml version="1.0" encoding="UTF-8"?>
<Book>
<Name>
Book1
</Name>
<Price>
USD.10.00
</Price>
</Book>
<Book>
<Name>
Book2
</Name>
<Price>
USD.15.40
</Price>
</Book>
<Book>
<Name>
Book3
</Name>
<Price>
USD.435.90
</Price>
</Book>
EUR_books.xml
<?xml version="1.0" encoding="UTF-8"?>
<Book>
<Name>
Book1
</Name>
<Price>
EUR.15.40
</Price>
</Book>
<Book>
<Name>
Book2
</Name>
<Price>
EUR.66.40
</Price>
</Book>
GDP_books.xml
<?xml version="1.0" encoding="UTF-8"?>
<Book>
<Name>
Book1
</Name>
<Price>
GBP.10.20
</Price>
</Book>
我得到的输出是:
GPB_books.xml
<?xml version="1.0" encoding="UTF-8"?>
<Book>
<Name>
Book1
</Name>
<Price>
GBP.10.20
</Price>
</Book>
EUR_books.xml
<Book>
<Name>
Book2
</Name>
<Price>
EUR.66.40
</Price>
</Book>
USD_books.xml
<Book>
<Name>
Book3
</Name>
<Price>
USD.435.90
</Price>
</Book>
我的代码:
from xml.etree.cElementTree import iterparse
for event, elem in context:
if elem.tag == 'Book':
Price = elem.find('Price').text
title = Price.split('.')[0].strip()
filename = format(title + "_Books.xml")
with open(filename, 'wb') as f:
f.write(bytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",'utf-8'))
f.write(ET.tostring(elem))
我需要使用相同货币的书籍在一个 xml 中,但我在文档后不断收到错误垃圾
解决方案
我看不出你的代码应该如何工作。使用 XSLT 2.0+ 最容易完成这种任务:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="2.0">
<xsl:template match="/">
<xsl:for-each-group select="//Book"
group-by="substring-before(normalize-space(Price), '.')">
<xsl:result-document href="{current-grouping-key()}_books.xml">
<xsl:copy-of select="current-group()"/>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:transform>
注意:尽管生成的文件不是格式良好的 XML 文档(它们是格式良好的 XML 片段),但这会产生您要求的输出。尝试解析这些文件很可能会失败,并显示一个错误,指出文档元素后有意外内容,除非您使用配置为解析格式良好的片段的解析器。通常,通常会在 Book 元素序列周围添加一个包装器元素,您可以通过将xsl:result-document
指令的内容更改为
<books>
<xsl:copy-of select="current-group()"/>
</books>
推荐阅读
- reactjs - 使用条件 const 反应调用函数并返回
- c# - 如何在类中缓存查询结果,然后根据 C# 方法中传递的参数重用它进行搜索?
- python - 格式化单行 XML 的问题
- javascript - Javascript 将所有 DOM 元素打印/可视化为保持其结构的节点树
- tensorflow - Tensorflow:累积张量的梯度
- android - Android:如何用字符换行?(不是用语言)帮助我
- itfoxtec-identity-saml2 - 如何将用户名/电子邮件提供给身份提供商以预先填写在 IdP 的用户名框中?
- javascript - WordPress REST API Ajax 显示更多帖子按钮
- python - TensorFlow 2.0 tf.keras API Eager 模式与 Graph 模式
- scrapy - evaljs 返回 nil 即使它不应该?