如何将不同文件的XML节点内容融合在一起?

问题描述 投票:-2回答:1

我有两个大的XML文件,其结构大致类似于此:

文件1

<thing id="1">
    <group id="1.1">
        <line id="1.1.1">First</line>
        <line id="1.1.2">Third</line>
    </group>
    <group id="1.2">
        <line id="1.2.1">Fifth</line>
    </group>
</thing>

文件2

<thing id="1">
    <group id="1.1">
        <line id="1.1.1">Second</line>
        <line id="1.1.2">Fourth</line>
    </group>
    <group id="1.2">
        <line id="1.2.1">Sixth</line>
    </group>
</thing>

预期输出

我需要实现的是这个

<thing id="1">
    <group id="1.1">
        <line id="1.1.1">FirstSecond</line>
        <line id="1.1.2">ThirdFourth</line>
    </group>
    <group id="1.2">
        <line id="1.2.1">FifthSixth</line>
    </group>
</thing>

[基本上,我希望将第二个文件中的行元素的内容追加到第一个文件中的行元素的内容之后。这些ID是唯一的。该行元素的内容除了文本之外,还可以包含其他XML节点。

文件很大且很笨拙,因此不幸的是,手动选择不是一种选择。

我一直在摆弄Java的XML库,但进展不大。

java xml parsing merge xml-parsing
1个回答
0
投票
这项工作的最佳工具是XSLT。您没有给出非常精确的说明(“大致相似”是什么意思?),但是对于给出的示例,您可以这样做

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="doc2" select="doc('file2.xml')"/> <xsl:key name="lineId" match="line" use="@id"/> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="line"> <line id="{@id}">{.}{key('lineId',@id,@doc2)}</line> </xsl:template> </xsl:transform>

例如,通过下载Saxon并使用命令,将此样式表应用于file1.xml。>

java net.sf.saxon.Transform -s:file1.xml -xsl:stylesheet.xsl

这是XSLT 3.0; XSLT 1.0中的解决方案会有点冗长,但难度不大。
© www.soinside.com 2019 - 2024. All rights reserved.