首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有递归XInclude语句的XML

带有递归XInclude语句的XML
EN

Stack Overflow用户
提问于 2020-09-10 01:15:18
回答 1查看 191关注 0票数 2

我有一个递归XInclude语句的问题。我有一个主文件,其中XInclude存在于另一个文件中。在包含的文件中还有更多的XInclude语句。

我用python和lxml库解析我的XML文件。因此,不幸的是,我只得到了以下内容。我的错误在哪里?或者递归使用XInlcude是不可取的?

谢谢你的帮助。

主文件

代码语言:javascript
复制
<?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>

第一个包含

代码语言:javascript
复制
<?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是相同的)

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST.INCLUDE>
    <FOO Id="Test_1_1">
        <BAR/>
    </FOO>
</TEST.INCLUDE>   

我使用以下python代码得到的结果。

代码语言:javascript
复制
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)

结果

代码语言:javascript
复制
<TEST xmlns:xi="http://www.w3.org/2001/XInclude" Id="MyTest">
  <FOO>
    <BAR/>
  </FOO>
  <FOO Id="Test_1_1">
    <BAR/>
  </FOO>
</TEST>

但是我已经预料到并希望得到以下结果

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 11:38:37

在主文件(Model.xml)中,您有以下include元素:

代码语言:javascript
复制
<xi:include xpointer="element(/1/1)" href="Test_1.xml"/>

它将只选择Test_1.xml中的第一个include元素。

要获得想要的结果,您需要在主文件中包含以下内容:

代码语言:javascript
复制
<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()方案来简化,该方案只需要一行:

代码语言:javascript
复制
<xi:include xpointer="xpointer(/TEST.INCLUDE/*)" href="Test_1.xml"/>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63816469

复制
相关文章

相似问题

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