使用 Python 解析两个 XML

Parse Two XML using Python

我有一个 XML 文件,其中包含 200 个 Event 块,如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<ProjectData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.project.com/proj1/projv" xsi:schemaLocation="http://www.pp.com/oj/p http://www.onj.com/p/IXX/schema/proj.xsd">
  <fileType>This file is sample</fileType>
  <header>
    <fileID>none</fileID>
    <version>1.0</version>
    <modified>2015-09-16T17:03:25</modified>
  </header>
  <EventList>
    <Event>
      <Id>0</Id>
      <pp define="something">2</pp>
      <Index>3</Index>
      <Conf ref="point">CFG.AC.UF</Conf>
      <Check>tttt</Check>
      <Group>wwll</Group>
      <Heart ref="point">mbmb</Heart>
      <Name>kkk</Name>
      <Thresh ref="point">kckcv</Thresh>
      <Hyster ref="point">foo</Hyster>
      <Trip ref="point">dim</Trip>
      <Clear ref="point">CLR.AC.UF</Clear>
    </Event>
  </EventList>
</ProjData>

Event 块包含我有兴趣获取的信息(仅其中 4 个:Id、Index、Name 和 Group)以生成我的新 xml文件。我想通过 python 代码来做到这一点。 有谁知道我如何通过 python.

实现这一目标

我的新 xml 文件应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Newevents>
   <event>
      <Id>0</Id>
      <Index>3</Index>
      <Name>kkk**$Id**</Name>
      <Group>wwll**$Index**</Group>
      <desc>placeholder</desc>
   </event>
</Newevents>

我还想添加 Id 和 Index,它们是用三位有效数字占位符命名和分组字符串的数字。 例如,如果 Id 是 1,我希望我的名字是 kkk001,或者如果 Id 是 3,我希望我的名字是 kkk003。 我的组元素字符串相同,但使用索引:如果索引为 5,我希望我的组为 wwll005。

我用谷歌搜索过,但有零星的信息。

  1. 谁能想出一个简洁的 python 代码来解析我的 xml 文件并生成新的 xml 文件的格式和编号我要上面的?

  2. 我有另一个名为 descXML.xml 的 xml 文件,我需要对其进行解析以仅获取 desc 元素字符串并添加它到我的 new xml 文件。 在我拥有的第二个 xml 文件 (descXML.xml) 中,应根据与我的新 xml 文件匹配的 Id 获取 desc 元素数据. 是否有可能检查 Id 元素是否等于我的新 xml 文件的 Id 元素数据,然后添加desc元素内容对应的码数?我怎样才能做到这一点?你能为此提供和示例 python 吗?

这是 descXML.xml 文件的样子,类似于我的第一个原始 xml 文件,这里也是 200 个 Event 块:

<EventList>
  <Event>
    <Mnemonic>AC.UF.SLOW</Mnemonic>
    <Id define="xyz">3</Id>
    <Index>13</Index>
    <Description>today was warm and I want to go swimming</Description>
  </Event>
<EventList>

上面的1和2可以合并成一个python文件吗?

我想要的最终 XML 文件应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Newevents>
   <event>
      <Id>3</Id>
      <Index>13</Index>
      <Name>kkk000</Name>
      <Group>wwll003</Group>
      <desc>today was warm and I want to go swimming</desc>
   </event>

根据以下给出的评论试用:

我试图在这里保持一致并尝试下面提供的解决方案但没有奏效,所以我提供了我的确切 xml 文件:

我的file1.xml

<?xml version='1.0' encoding='UTF-8'?>
<Dataizx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.kklk.com/cx1/ASD" xsi:schemaLocation="http://www.kklk.com/cx1/ASD http://www.kklk.com/cx1/ASD/schema/tell.xsd">
  <fileType>Auto-Generated IXX Events Metadata</fileType>
  <header>
    <fileID>none</fileID>
    <version>1.0</version>
    <modified>2015-09-16T17:03:25</modified>
  </header>
  <EventList>
    <Event>
      <Mnemonic>ijk</Mnemonic>
      <Id define="rece">2</Id>
      <Index>0</Index>
      <Config ref="point">shine</Config>
    </Event>
    <Event>
      <Mnem>xyz</Mnem>
      <Id define="teller">3</Id>
      <Index>1</Index>
      <Config ref="point">good</Config>
    </Event>
  </EventList>
</Dataizx>

这是我的 xml,其中包含描述:

<?xml version="1.0" encoding="UTF-8"?>
<IXXData xmlns="http://www.mnm.com/mnm/mnm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:i="http://www.mnm.com/mnm/mnm" xsi:schemaLocation="http://www.mnm.com/mnm/mnm http://www.mnm.com/mnm/mnm/schema/mnm.xsd">
    <fileType>Merged IXX Events Metadata</fileType>
    <header>
        <fileID>none</fileID>
        <version>1.0 + none</version>
        <description>Merged event metadata.</description>
    </header>
    <EventList>
        <Event>
            <Id define="mmm">2</Id>
            <Description>everything was good.</Description>
        </Event>
        <Event>
            <Id define="lll">4</Id>
            <Description>teller and the other one.</Description>
        </Event>
        <Event>
            <Id define="ggg">3</Id>
            <Description>weather is nice.</Description>
        </Event>
    </EventList>
</IXXData>

我使用了你的 xsl 和 python 但我无法从第二个文件中获取描述。

考虑一个 XLST 解决方案,它可以从原始 XML 中挑选各种节点,并根据特定标准合并外部 XML 中的节点。 Python(像许多面向对象的编程语言一样)在其 lxml 模块中维护一个 XSLT processor

作为信息,XSLT 是一种特殊用途的声明性编程语言(不是面向对象的语言),用于将 XML 文件转换为各种格式和结构。

此外,为了您的目的,您可以使用 XSLT 的 document()concat() 函数。您的 XSLT 有点复杂,因为它需要设置一个变量来匹配文档中的 ID,并且有相当多的名称空间需要管理。

XSLT(在外部保存为 .xsl 文件)

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.kklk.com/cx1/ASD"
 xmlns:i="http://www.sesolar.com/SE1/ICB"
 xsi:schemaLocation="http://www.kklk.com/cx1/ASD http://www.kklk.com/cx1/ASD/schema/tell.xsd"
 exclude-result-prefixes="xsi p i">

<xsl:output version="1.0" encoding="UTF-8"/>

<xsl:template match="p:EventList">
    <NewsEvents>        
        <xsl:for-each select="p:Event">            
            <Id><xsl:value-of select="p:Id"/></Id>
            <Index><xsl:value-of select="p:Index"/></Index>
            <Name><xsl:value-of select="concat(p:Name, '00', p:Id)"/></Name>
            <Group><xsl:value-of select="concat(p:Group, '00', p:Index)"/></Group>
            <xsl:variable name="descID" select="p:Id"/>
            <desc><xsl:value-of select="document('descXML.xml')/i:IcbData/i:EventList/
                  i:Event/i:Id[text()=$descID]/following-sibling::i:Description"/></desc>            
        </xsl:for-each>
    </NewsEvents>
</xsl:template>

</xsl:transform>

Python(加载 .xml 和 .xsl,将前者与后者转换为新的 .xml 输出)

#!/usr/bin/python
import lxml.etree as ET

dom = ET.parse('C:\Path\To\MainXML.xml')
xslt = ET.parse('C:\Path\To\AboveXSLT.xsl')
transform = ET.XSLT(xslt)
newdom = transform(dom)

tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True)

xmlfile = open('C:\Path\To\Output.xml','wb')
xmlfile.write(tree_out)
xmlfile.close()

输出(使用上面发布的XML数据)

(如果descXML的Id匹配任何Event的Id,下面相应的<desc>节点将被填充)

<?xml version='1.0' encoding='UTF-8'?>
<Dataroot>
  <NewsEvents>
    <Id>2</Id>
    <Index>0</Index>
    <Name>002</Name>
    <Group>000</Group>
    <desc>everything was good.</desc>
  </NewsEvents>
  <NewsEvents>
    <Id>3</Id>
    <Index>1</Index>
    <Name>003</Name>
    <Group>001</Group>
    <desc>weather is nice.</desc>
  </NewsEvents>
</Dataroot>

我知道这种 XSLT 方法可能看起来很吓人,但它在 Python 代码中节省了很多循环和创建元素、子元素和属性的时间。每当处理 XML 个文件时,我经常推荐这条路线,我确实发现它在程序员中被忽略,而不仅仅是 Python 人。同时,最容易毫无疑问地使用另一种特殊用途的声明性语言 -SQL!