Включить один XML в другой XML и проанализировать его с помощью Python - PullRequest
0 голосов
/ 14 октября 2019

Я хотел включить XML-файл в другой XML-файл и проанализировать его с помощью python. Я пытаюсь добиться этого через Xinclude. Существует файл file1.xml, который выглядит как

<?xml version="1.0"?>
<root>
  <document xmlns:xi="http://www.w3.org/2001/XInclude">
     <xi:include href="file2.xml" parse="xml" />
  </document>
  <test>some text</test>
</root>

, и файл file2.xml, который выглядит как

<para>This is a paragraph.</para>

Теперь в своем коде Python я попытался получить к нему доступ:

from xml.etree import ElementTree, ElementInclude

tree = ElementTree.parse("file1.xml")
root = tree.getroot()
for child in root.getchildren():
    print child.tag

Он печатает тег всех дочерних элементов корня

document
test

Теперь, когда я пытаюсь напечатать дочерние объекты напрямую, как

print root.document
print root.test

Он говорит, что корень не имеетдети назвали тест или документ. Тогда как мне получить доступ к содержимому файла file2.xml?

Я знаю, что могу получить доступ к элементам XML из python со схемой вроде:

    schema=etree.XMLSchema(objectify.fromstring(configSchema))
    xmlParser = objectify.makeparser(schema = schema)
    cfg = objectify.fromstring(xmlContents, xmlParser)
    print cfg.elemetName # access element

Но так как здесь один файл XMLвходит в другой, я запутался, как написать схему. Как я могу решить это?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Ниже

import xml.etree.ElementTree as ET


xml1 = '''<?xml version="1.0"?>
<root>
  <test>some text</test>
</root>'''

xml2 = '''<para>This is a paragraph.</para>'''

root1 = ET.fromstring(xml1)
root2 = ET.fromstring(xml2)

root1.insert(0,root2)

para_value = root1.find('.//para').text
print(para_value)

выход

This is a paragraph.
0 голосов
/ 14 октября 2019

Не уверен, почему вы хотите использовать XInclude, но включение XML-файла в другой является базовым механизмом SGML и XML и может быть достигнуто без XInclude так же просто, как:

<!DOCTYPE root [
  <!ENTITY externaldoc SYSTEM "file2.xml">
]>
<root>
  <document>
    &externaldoc;
  </document>
  <test>some text</test>
</root>
...