XML 使用递归 XInclude 语句
XML with recursive XInclude statements
递归 XInclude 语句有问题。我有一个主文件,其中 XInclude 存在于另一个文件中。在包含的文件中还有更多的 XInclude 语句。
我用 python 和库 lxml 解析我的 XML 文件。结果,我不幸只得到以下信息。我的错误在哪里?还是不需要递归使用 XInlcude?
感谢您的帮助。
主文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST Id = "MyTest" xmlns:xi="http://www.w3.org/2001/XInclude" >
<FOO>
<BAR/>
</FOO>
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
</TEST>
拳头包含
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST.INCLUDE xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="Test_1_1.xml" xpointer="element(/1/1)"/>
<xi:include href="Test_1_2.xml" xpointer="element(/1/1)"/>
<xi:include href="Test_1_3.xml" xpointer="element(/1/1)"/>
</TEST.INCLUDE>
第二个包含(Test_1_1.xml、Test_1_2.xml 和 Test_1_3.xml 对于此示例相同)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST.INCLUDE>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
</TEST.INCLUDE>
我使用以下 python 代码得到的结果。
import lxml
from lxml import etree
import xml.etree.ElementTree as ET
XMLParser = lxml.etree.XMLParser()
XMLFile = lxml.etree.parse('Model.xml', parser=XMLParser)
XMLFile.xinclude()
XMLFile.write(f"Model_xinclude.xml",method="xml",pretty_print=True)
结果
<TEST xmlns:xi="http://www.w3.org/2001/XInclude" Id="MyTest">
<FOO>
<BAR/>
</FOO>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
</TEST>
但我会期望并想要以下结果
<TEST xmlns:xi="http://www.w3.org/2001/XInclude" Id="MyTest">
<FOO>
<BAR/>
</FOO>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
<FOO Id="Test_1_2">
<BAR/>
</FOO>
<FOO Id="Test_1_3">
<BAR/>
</FOO>
</TEST>
在主文件 (Model.xml) 中,您有这个 include
元素:
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
它将 select 仅 Test_1.xml 中的第一个 include
元素。
要获得想要的结果,您需要在主文件中添加以下内容:
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
<xi:include xpointer="element(/1/2)" href="Test_1.xml"/>
<xi:include xpointer="element(/1/3)" href="Test_1.xml"/>
这可以通过使用 xpointer()
方案来简化,它需要一行:
<xi:include xpointer="xpointer(/TEST.INCLUDE/*)" href="Test_1.xml"/>
递归 XInclude 语句有问题。我有一个主文件,其中 XInclude 存在于另一个文件中。在包含的文件中还有更多的 XInclude 语句。
我用 python 和库 lxml 解析我的 XML 文件。结果,我不幸只得到以下信息。我的错误在哪里?还是不需要递归使用 XInlcude?
感谢您的帮助。
主文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST Id = "MyTest" xmlns:xi="http://www.w3.org/2001/XInclude" >
<FOO>
<BAR/>
</FOO>
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
</TEST>
拳头包含
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST.INCLUDE xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="Test_1_1.xml" xpointer="element(/1/1)"/>
<xi:include href="Test_1_2.xml" xpointer="element(/1/1)"/>
<xi:include href="Test_1_3.xml" xpointer="element(/1/1)"/>
</TEST.INCLUDE>
第二个包含(Test_1_1.xml、Test_1_2.xml 和 Test_1_3.xml 对于此示例相同)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST.INCLUDE>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
</TEST.INCLUDE>
我使用以下 python 代码得到的结果。
import lxml
from lxml import etree
import xml.etree.ElementTree as ET
XMLParser = lxml.etree.XMLParser()
XMLFile = lxml.etree.parse('Model.xml', parser=XMLParser)
XMLFile.xinclude()
XMLFile.write(f"Model_xinclude.xml",method="xml",pretty_print=True)
结果
<TEST xmlns:xi="http://www.w3.org/2001/XInclude" Id="MyTest">
<FOO>
<BAR/>
</FOO>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
</TEST>
但我会期望并想要以下结果
<TEST xmlns:xi="http://www.w3.org/2001/XInclude" Id="MyTest">
<FOO>
<BAR/>
</FOO>
<FOO Id="Test_1_1">
<BAR/>
</FOO>
<FOO Id="Test_1_2">
<BAR/>
</FOO>
<FOO Id="Test_1_3">
<BAR/>
</FOO>
</TEST>
在主文件 (Model.xml) 中,您有这个 include
元素:
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
它将 select 仅 Test_1.xml 中的第一个 include
元素。
要获得想要的结果,您需要在主文件中添加以下内容:
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
<xi:include xpointer="element(/1/2)" href="Test_1.xml"/>
<xi:include xpointer="element(/1/3)" href="Test_1.xml"/>
这可以通过使用 xpointer()
方案来简化,它需要一行:
<xi:include xpointer="xpointer(/TEST.INCLUDE/*)" href="Test_1.xml"/>