Использование 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), но почти нигде.

Другие вопросы по тегам