繁体   English   中英

使用Python ElementTree / ElementInclude和xpointer访问包含的XML文件

[英]Using Python ElementTree/ElementInclude and xpointer to access included XML files

我有一个'main.xml'文件,其中包含2个'sub_x.xml'文件。 include行使用'xpointer'来指向/包含include 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属性。

它使用lxmlxinclude()方法以你想要的方式工作:

from lxml import etree 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM