【问题标题】:XML with recursive XInclude statements带有递归 XInclude 语句的 XML
【发布时间】:2020-12-28 04:06:40
【问题描述】:

我对递归 XInclude 语句有疑问。我有一个主文件,其中 XInclude 存在于另一个文件中。包含的文件中还有进一步的 XInclude 语句。

我使用 python 和库 lxml 解析我的 XML 文件。结果,不幸的是,我只得到以下信息。我的错误在哪里?还是不需要递归使用 XInlcude?​​p>

感谢您的帮助。

主文件

<?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>

【问题讨论】:

    标签: python xml lxml xinclude xpointer


    【解决方案1】:

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

    <xi:include xpointer="element(/1/1)" href="Test_1.xml"/>
    

    它将仅选择 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"/>
    

    【讨论】:

    • 这是可以理解的。 element(/1/1) 选择 one 元素:Test_1.xml 中TEST.INCLUDE 的第一个子元素。
    • 您好 mzjn,谢谢您的回答。当然。很抱歉我的第一个答案是鲁莽的。清楚地阅读您的答案后,我理解正确并看到了我的错误。它工作得很好。再次,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2018-12-27
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多