【问题标题】:How to merge two XML files with certain condition using StAX如何使用 StAX 合并具有特定条件的两个 XML 文件
【发布时间】:2021-09-25 11:09:28
【问题描述】:

例如,假设我们有两个 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 与第一个文件中的一个匹配,则将其从第二个文件中放入。 合并后的文件应如下所示:

“合并.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>

我该怎么做? 提前致谢!

【问题讨论】:

  • 我不认为 StAX 是一个特别好的技术选择。

标签: java xml merge stax


【解决方案1】:

如果您对可以使用的技术很灵活,这里是 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>

【讨论】:

    【解决方案2】:

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

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

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

    这两个工具都有很好的文档记录,可以很容易地在网上查找,所以我不会粘贴代码示例。

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

    【讨论】:

    • XSLT 有一个学习曲线,但 XSLT 中大多数问题的解决方案只是您用低级语言编写的代码行数的一小部分,以及可读性和可维护性(以及错误) 与解决方案中的代码行数直接相关。 XSLT 拥有庞大的用户群,StackOverflow 中标记为“xslt”的问题数量就是明证。
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多