首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中有选择地合并两个xml文件

如何在java中有选择地合并两个xml文件
EN

Stack Overflow用户
提问于 2019-05-08 20:42:52
回答 1查看 73关注 0票数 0

我有两个XML文件(源文件和目标文件),希望使用Java有选择地将源文件的一部分合并到目标文件中。这些文件具有相同的结构,但包含在不同级别具有相同名称的嵌套标记(示例如下)。

源和目标可以有多个/Root/folders/folder,我希望从源中选择(具有指定标题),并将其与目标中的任何内容合并。如果目标已有内容,则不能覆盖;必须添加源内容。在下面的示例中,结果将包含具有多个<folders><folder caption="TestBlock" description="desc" moniker="">

我既不精通Java,也不精通XML (但是老板让我这么做,所以……)。

Googling已经展示了许多从文件A到文件B的直接追加的示例,其中没有复杂的嵌套结构,但这些并没有解决我的问题。

源文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
    <folders>
        <folder caption="TestBlock" description="desc" moniker="">
            <folders>
                <folder caption="tb_insert" description="desc" moniker="">
                    <folders>
                        <folder caption="000_Test" description="desc" moniker="">
                            <references>
                                <ref key="{somekey}" />
                            </references>
                        </folder>
                    </folders>
                    <references>
                        <ref key="{somekey}" />
                    </references>
                </folder>
            </folders>
        </folder>
        <folder caption="AnotherBlock" description="desc" moniker="">
            <folders>
                <folder caption="abc" description="desc" moniker="">
                    <references>
                        <ref key="{somekey}" />
                    </references>
                </folder>
            </folders>
        </folder>
    </folders>
</Root>

目标文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
    <folders>
        <folder caption="Core" description="desc" moniker="" />
        <folder caption="TestBlock" description="desc" moniker="">
            <folders>
                <folder caption="000_Temp" description="desc" moniker="">
                    <folders>
                        <folder caption="000_Temp2" description="desc" moniker="">
                            <references>
                                <ref key="{somekey}" />
                            </references>
                        </folder>
                    </folders>
                </folder>
            </folders>
            <references>
                <ref key="{somekey}" />
            </references>
        </folder>
    </folders>
</Root>

所需输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
    <folders>
        <folder caption="Core" description="desc" moniker="" />
        <folder caption="TestBlock" description="desc" moniker="">
            <folders>
                <folder caption="tb_insert" description="desc" moniker="">
                    <folders>
                        <folder caption="000_Test" description="desc" moniker="">
                            <references>
                                <ref key="{somekey}" />
                            </references>
                        </folder>
                    </folders>
                    <references>
                        <ref key="{somekey}" />
                    </references>
                </folder>
            </folders>
            <folders>
                <folder caption="000_Temp" description="desc" moniker="">
                    <folders>
                        <folder caption="000_Temp2" description="desc" moniker="">
                            <references>
                                <ref key="{somekey}" />
                            </references>
                        </folder>
                    </folders>
                </folder>
            </folders>
            <references>
                <ref key="{somekey}" />
            </references>
        </folder>
    </folders>
</Root>

任何帮助(新手级别,请)将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-05-08 22:54:39

我不认为您已经完整地指定了需求(一个示例并没有制定规范),但是如果我们假设第一个源文档恰好包含一个/Root/folders/folder,并且它的内容是替换目标文档中具有匹配标题的唯一//folder,那么逻辑可以在XSLT3.0中编写为

代码语言:javascript
复制
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:mode on-no-match="shallow-copy"/>
    <xsl:variable name="replacement" select="doc('source.xml')/Root/folders/folder"/>
    <xsl:template match="folder[@caption = $replacement/$caption]">
      <xsl:copy-of select="$replacement"/>
    </xsl:template>
</xsl:transform>

您可以使用Saxon库通过以下代码从Java运行此代码:

代码语言:javascript
复制
Processor proc = new Processor(false);
XsltCompiler comp = proc.newXsltCompiler();
Xslt30Transformer trans = comp.compile("stylesheet.xsl").load30();
Serailizer out = proc.newSerializer(new File("output.xml"));
trans.applyTemplates(new StreamSource("destination.xml"), out);

如果您更喜欢使用JDK附带的XSLT 1.0处理程序,那么这也是可能的,它只需要更多一点的代码。与直接使用低级DOM API相比,它的代码量仍然要少得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56041094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档