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

5 投票
1 回答
3411 浏览
提问于 2025-04-18 06:41

我有一个名为'main.xml'的文件,它里面包含了两个'sub_x.xml'文件。包含的部分使用了'xpointer',目的是只引入特定的标签。可是,当我用ElementTree来检查这个操作是否成功时,它显示的是整个'sub' 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文件中被复制过来了。

1 个回答

4

ElementInclude 并不支持 XInclude 的所有功能。比如,xpointer 属性在 <include> 元素中是被忽略的。

不过,如果你使用 lxmlxinclude() 方法,就能按照你想要的方式工作:

from lxml import etree 

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

需要注意的是,XPointer xpointer() 方案从来没有成为 W3C 推荐标准(它仍然只是一个工作草案)。虽然它在 libxml2(lxml 背后的 C 库)中得到了实现,但几乎没有其他地方使用。

撰写回答