5

我有一个“main.xml”文件,其中包含 2 个“sub_x.xml”文件。包含行使用“xpointer”仅指向/包含包含 xml 的特定标签。当我使用 ElementTree 来确定这是否正常工作时,它表明整个“子”xml 文件都被包括在内,而不仅仅是我想要的标签。我不确定我是否错误地使用了 xpointer,或者 ElementTree 或 ElementInclude 不支持这一点。以下是文件:

------'main.xml'--------

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="sub_1.xml" xpointer="xpointer(//ModelInfo/Model)" parse="xml" />
    <xi:include href="sub_2.xml" xpointer="xpointer(//ModelInfo/Model)" parse="xml" />  
</ModelInfo>`

--------'sub_1.xml'-----

`<?xml version="1.0" ?>
<ModelInfo>
  <Model ModelName="glow">
    <Variables>
     <Variable Alias="glow_val" Input="False" Output="True" />
    </Variables>
  </Model>
</ModelInfo>`

-------'sub_2.xml'-----

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo>
  <Model ModelName="sirpwr_b_supply8v1">
   <Variables>
    <Variable Alias="sirpwr_a_supplyecu_Snsr8vIstat" Input="True" Output="False" />
   </Variables>
  </Model>
</ModelInfo>`

我希望“main.xml”在 ElementTree 中显示为:

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo xmlns:xi="http://www.w3.org/2001/XInclude">
  <Model ModelName="glow">
    <Variables>
     <Variable Alias="glow_val" Input="False" Output="True" />
    </Variables>
  </Model>
  <Model ModelName="sirpwr_b_supply8v1">
    <Variables>
     <Variable Alias="sirpwr_a_supplyecu_Snsr8vIstat" Input="True" Output="False" />
     <Variable Alias="sirpwr_b_supply8v1_qstat" Input="False" Output="True" />
   </Variables>
   </Model>
</ModelInfo>`

我正在运行以加载 XML 文件并进行测试的脚本是:

`tree = ElementTree.parse('main.xml')
root = tree.getroot()
ElementInclude.include(root)
for element in root:
    print element.tag`

xpointer 无法正常工作,因为正在从“sub_x”xml 文件中复制“ModelInfo”。

4

1 回答 1

4

ElementInclude不支持所有的 XInclude。元素上的xpointer属性被忽略。<include>

它确实可以使用lxmlxinclude()方法按照您想要的方式工作:

from lxml import etree 

tree = etree.parse('main.xml')
tree.xinclude()
print etree.tostring(tree)

请注意,XPointerxpointer()方案从未达到 W3C 推荐的状态(它仍然只是一个工作草案)。它已在 libxml2(lxml 背后的 C 库)中实现,但几乎没有其他地方实现。

于 2014-05-16T15:49:29.403 回答