首页 > 解决方案 > 将大 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 中,但我在文档后不断收到错误垃圾

标签: pythonxml

解决方案


我看不出你的代码应该如何工作。使用 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>

推荐阅读