如何在一个XML文件中包含另一个XML文件,而不需要源XML文件的根节点?

3
作为标题中所要求的,我有两个XML文件,结构如下:
A.xml
<Root>
    <J>
        <N>
            //here I want to include B.xml
        </N>
    </J>
</Root>

B.xml

<Root>
    <M></M>
    <O></O>
    <P></P> 
</Root>

我能够使用 Xinclude,但是这会在 A.xml 中包含 B.XML 的根元素。

我希望在包含 B.xml 后,A.xml 如下所示:

<Root>
    <J>
        <N>
            <M></M>
            <O></O>
            <P></P>
        </N>
    </J>
</Root>

请帮我摆脱这个问题。

2个回答

1
看这里:

https://blogs.gnome.org/shaunm/2011/07/21/understanding-xinclude/

你可以这样做:

<include href="someFile.xml" xpointer="xpointer(/Root/M)"  xmlns="http://www.w3.org/2001/XInclude"/>
<include href="someFile.xml" xpointer="xpointer(/Root/O)"  xmlns="http://www.w3.org/2001/XInclude"/>
<include href="someFile.xml" xpointer="xpointer(/Root/P)"   xmlns="http://www.w3.org/2001/XInclude"/>

也许有更好的方法-只是介绍一个想法。

或者,如果您有选择,可以尝试不同的XML结构。例如,B.xml可以将“N”作为其根节点吗?

<N>
    <M> 
    <O> 
    <P>
</N>

然后包含上一级文件。当然,这可能不可能,N可能有其他内容,或者您可能无法更改XML结构。


感谢@afrogonabike提供的解决方案,但是当我尝试应用它时,使用Java解析A.xml时出现以下异常。原因:XPointer解析失败。 - Rahul Sahu

1

正如afrogonabike所提到的,你可以使用XInclude和XPointer来选择需要包含的元素。不幸的是,XPointer没有指定通配符,是否可能取决于实现。因此,除非你事先知道哪些元素会在B.xml中,否则你就没有办法了。似乎在不同的实现中,XPoint支持的内容有很大的差异,因此要使其在某种程度上具有可移植性或可靠性可能会比较棘手。

我建议你使用XSLT代替。XPath更加方便,而XSLT有一个document()函数,可以引用输入文档之外的其他文档中的元素。以下是你可以参考的基础内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" />

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="N">
        <xsl:copy>
            <xsl:apply-templates select="document('B.xml')/*/*" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

默认情况下,样式表将复制任何节点和属性。如果遇到一个N元素,它将复制该元素,但是不会处理内容,而是将模板应用于所引用文档(B.xml)的根子元素。
请注意,这仅在B.xml与您的输入文档位于同一位置时才有效。如果您不是从文件而是从流开始,您需要想出其他方法。这将取决于您的环境。根据使用的XSLT处理器,您可以将B的内容作为转换的参数提供。

感谢@G_H提供的解决方案。您能告诉我在哪里放置这个逻辑吗?根据我的理解,我应该将其放置在A.xml文件中的<N>//这里</N>标签内。如果我错了,请纠正我。 - Rahul Sahu
@RahulSahu 我不太确定你的问题是什么。你的意思是样式表要放在哪里?XSLT是一种独立的技术,可以应用于XML上。在浏览器中,你可以将样式表链接到XML上。在Java、C++或类似的语言中,你需要使用像Xalan这样的XSLT处理器。你在哪个环境中工作?用的是哪种语言? - G_H
我正在使用Java编写桌面应用程序。 - Rahul Sahu
然后,您可以通过Java XML转换API使用样式表。相关类可以在javax.xml.transform包中找到。它是Java SE API的一部分,并且具有默认实现,因此您不需要额外的依赖项。关于如何使用API和如何使用XSLT的信息可以很容易地在网上找到。我提供的XSLT应该提供足够的基础,并且实际上可能是您所需的全部内容,只要您找到某种方式来提供要包含的文档(作为文件或参数)。 - G_H
非常感谢... @G_H - Rahul Sahu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接