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

标签 python xml elementtree xinclude xpointer

我有一个包含 2 个“sub_x.xml”文件的“main.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”。

最佳答案

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

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

from lxml import etree 

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

请注意 XPointer xpointer() 方案从未达到 W3C 推荐的状态(它仍然只是一个工作草案)。它已在 libxml2(lxml 背后的 C 库)中实现,但几乎无处可寻。

关于python - 使用 Python ElementTree/ElementInclude 和 xpointer 访问包含的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23684996/

相关文章:

xml - XPath - 从具有最高节点值的父节点中提取值

python-3.x - 命名空间前缀无效

Python + 外籍人士 : Error on &#0; entities

python - IronPython 和 xml.etree.ElementTree 非法字符错误

python - 将 Azure Functions 与 Python 结合使用 - Numpy 和 Pandas

python - 从带时间戳的流量计数器创建摘要统计信息

python - 对于大数据(通过 stdin.readlines())在 python 中比 map() 更快的方法

python - 在 python 中识别字符串中的子字符串的最有效方法?

java - 从 Java 中的 xml 元素读取 CDATA 时出现错误

java - 使用 Jackson XML 绑定(bind)将列表映射到 Pojo