как правильно использовать Xinclude, чтобы видеть данные всех детей? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующие XML документы:

doc_1: (X включает второй документ)

<?xml version="1.0" encoding="utf-8"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="doc_2.xml" parse="xml" /> 
</document>

doc_2:

 <?xml version="1.0" encoding="utf-8"?>
 <para>This is a paragraph.</para>

Мой код выглядит как следует:

from lxml import tree

tree = etree.parse("stck_oflow_test.xml") #load file
tree.xinclude()                                                  #recursively includes files

root = tree.getroot()


def print_root():
    for child in root:
         print (child.tag, child.attrib, child.text)
    
print_root()

Вывод хорош для моих целей; para {} Это абзац.

Но вот в чем проблема, если я изменю doc_2 на файл, который имеет данные в форме:

<?xml version="1.0" encoding="utf-8"?>
<para>

    <length>177</length>
    <weight>63</weight>

</para>

, тогда вывод no long содержит содержимое doc_2. Запуск того же кода python приводит к выводу:

para {}

Как это исправить?

Заранее спасибо

1 Ответ

0 голосов
/ 14 июля 2020

Это не проблема XInclude. Эта часть работает.

for child in root выполняет итерацию по непосредственным дочерним элементам root. В этом случае есть один дочерний элемент: элемент <para>.

Для перебора всех потомков (включая <length> и <weight>) вместо него можно использовать for child in root.iter(). Это приведет к следующему выводу:

document {} 
  
para {} 
  
length {} 177
weight {} 63
...