我有一个'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不工作,因为'ModelInfo'正在从'sub_x' xml文件复制过来。
ElementInclude
不支持所有的XInclude。忽略<include>
元素上的xpointer
属性。
使用lxml和xinclude()
方法可以按照您想要的方式工作:
from lxml import etree
tree = etree.parse('main.xml')
tree.xinclude()
print etree.tostring(tree)
请注意,XPointer xpointer()
方案从未达到W3C推荐的状态(它仍然只是一个工作草案)。它已经在libxml2 (lxml背后的C库)中实现,但几乎没有在其他地方实现。