gpt4 book ai didi

xml - 如何使用带有 Xinclude 的 xpointer 来引用元素

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:05 26 4
gpt4 key购买 nike

我想合并 2 个具有相同结构的 XML 文件来制作一个。例如;

Test1.xml

<?xml version="1.0" encoding="UTF-8"?>

<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
</ns:Root>

Test2.xml

<?xml version="1.0" encoding="UTF-8"?>

<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="999">
<ns:element2 id="999.1" order="1">
<ns:element3 id="999.1.1" />
</ns:element2>
</ns:element1>
</ns:Root>

创造

TestOutput.xml

<?xml version="1.0" encoding="UTF-8"?>

<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
<ns:element1 id="999">
<ns:element2 id="999.1" order="1">
<ns:element3 id="999.1.1" />
</ns:element2>
</ns:element1>
</ns:Root>

即一个 XML 文件,其中包含每个文件的所有元素。

我在 StackOverflow 上发现了一个有用的问题,并提出了这个问题;

合并.xml

<?xml version="1.0"?>

<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace">

<xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" />

<xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" />

</ns:Root>

我通过这样做来运行(出于涉及的原因,我需要使用 xmllint)

xmllint -xinclude Merge.xml

但这不起作用,它会提示各种问题,这些问题似乎与 xpointer 有关。

parser error : warning: ChildSeq not starting by /1
Merge.xml:7: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1)
Merge.xml:7: element include: XInclude error : could not load Test1.xml, and no fallback was found
parser error : warning: ChildSeq not starting by /1
Merge.xml:9: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1)
Merge.xml:9: element include: XInclude error : could not load Test2.xml, and no fallback was found
<?xml version="1.0"?>
<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="urn:TestNamespace">

<xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/>

<xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/>

</ns:Root>

如果我在 Merge.xml 中省略 xpointer 属性,那么我会得到一些合理的输出,但它当然不仅仅是包含我想要的元素。

有人可以就我在 xpointer 上做错了什么提供一些建议吗?

感谢期待。

最佳答案

我对此进行了更多尝试,并在网络上找到了大量示例,表明我所做的是正确的。现在这是一个工作版本...

<?xml version="1.0"?>

<Root xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="http://testurl.com/now">

<xi:include href="Test1.xml" xpointer="xmlns(ns=http://testurl.com/now)xpointer(/ns:Root/ns:element1)" parse="xml" />
<xi:include href="Test2.xml" xpointer="xpointer(//Root/element1)" parse="xml" />

</Root>

此示例使用具有命名空间的 Test1.xml 版本和不具有命名空间的 Test2.xml。

输出现在看起来像这样......

<?xml version="1.0"?>
<Root xmlns:xi="http://www.w3.org/2003/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://testurl.com/now">

<ns:element1 xmlns:ns="http://testurl.com/now" id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1"/>
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2"/>
</ns:element2>
</ns:element1><ns:element1 xmlns:ns="http://testurl.com/now" id="003">
<ns:element2 id="007.0" order="1">
<ns:element3 id="007.1.1"/>
</ns:element2>
</ns:element1><ns:element1 xmlns:ns="http://testurl.com/now" id="002">
<ns:element2 id="002.1" order="3">
<ns:element3 id="002.1.1"/>
</ns:element2>
<ns:element2 id="002.2" order="4">
<ns:element3 id="002.1.2"/>
</ns:element2>
</ns:element1>
<element1 id="999">
<element2 id="999.1" order="1">
<element3 id="999.1.1"/>
</element2>
</element1>

</Root>

这当然可以接受,如果element1的开闭换行还在就好了

关于xml - 如何使用带有 Xinclude 的 xpointer 来引用元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com