如何使用 StAX 合并具有特定条件的两个 XML 文件

问题描述

例如,假设我们有两个 XML 文件

“1.xml”

<School>
   <Stdent id="1">
      <Name>Jhon</Name>
      <Age>12</Age>
      <Grade>7</Grade>
   </Student>
   <Stdent id="2">
      <Name>Mike</Name>
      <Age>11</Age>
      <Grade>8</Grade>
   </Student>
</School>

“2.xml”

<School>
   <Stdent id="1">
      <Name>Jhon</Name>
      <Age>13</Age>
      <Grade>9</Grade>
   </Student>
   <Stdent id="3">
      <Name>Ann</Name>
      <Age>11</Age>
      <Grade>10</Grade>
    </Student>
</School>

对于合并文件,条件是如果第二个文件中的学生 ID 与第一个文件中的学生 ID 匹配,则将其从第二个文件中取出。 合并后的文件应如下所示:

“合并.xml”

<School>
   <Stdent id="1">
      <Name>Jhon</Name>
      <Age>13</Age>
      <Grade>9</Grade>
   </Student>
   <Stdent id="2">
      <Name>Mike</Name>
      <Age>11</Age>
      <Grade>8</Grade>
   </Student>
   <Stdent id="3">
      <Name>Ann</Name>
      <Age>11</Age>
      <Grade>10</Grade>
    </Student>
</School>

我该怎么做? 提前致谢!

解决方法

如果您对可以使用的技术很灵活,这里是 XSLT 3.0 解决方案:

<xsl:merge>
  <xsl:merge-source for-each-source="'xml1.xml','xml2.xml'"
                    select="//Stdent">
    <xsl:merge-key select="@id"/>
  </xsl:merge-source>
  <xsl:merge-action>
    <xsl:copy-of select="current-merge-group()[last()]"/>
  </xsl:merge-action>
</xsl:merge>
,

您的问题是用 Java 标记的,所以我假设您正在使用它。

有两种方法可以实现,一种是使用 JAXB——它是一个标准的 Java 库,可促进 XML 与 Java 对象之间的映射。您的文件看起来很有条理,所以这就是我的建议。您可以基于 XML 创建模型类,并使用该库将文件转换为 Java 对象。您还可以根据 XML 文件生成模式并将该模式​​传递给 JAXB,它会为您生成模型类。

第二个选项是使用 DocumentBuilder 类解析文件并手动插入节点。

这两个工具都有详细的文档,可以很容易地在线查找,所以我不会粘贴代码示例。

我不会推荐其他人为这么简单的事情建议的 XSLT 方法。 XSLT 难以阅读和维护,而且不常用。无论如何,以编程方式操作 XML 肯定会在某些时候派上用场。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...