繁体   English   中英

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

[英]How to merge two XML files with certain condition using StAX

例如,假设我们有两个 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 肯定会在某些时候派上用场。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM