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