Использование Python ElementTree/ElementInclude и xpointer для доступа к включенным файлам XML
У меня есть файл "main.xml", который включает в себя 2 файла "sub_x.xml". Строки включения используют 'xpointer' только для указания / включения определенных тегов включаемых XML. Когда я использую 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" копируется из XML-файлов "sub_x".
1 ответ
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 (библиотека C за lxml), но почти нигде.