2017-01-25 4 views
0

Я пытаюсь проанализировать XML-документ, чтобы найти все материнские активы, написанные людьми в нашей компании. Проблема, с которой я столкнулся, устраняет всех детей. Например, в фрагменте кода нижеКак перечислить узлы XML, которые не содержат конкретных дочерних элементов

<PAGE ID="ID0001.4"> 
</PAGE> 
<PAGE> 
</PAGE> 
<PAGE ID="ID0003.1"> 
    <PAGE> 
     <PAGE ID="ID0004"> 
      <PAGE ID="ID0007.8"> 
      </PAGE> 
     </PAGE> 
    </PAGE> 
</PAGE> 
<PAGE> 
    <PAGE> 
     <PAGE ID="ID0012.9"> 
      <PAGE ID="ID0009.2"> 
      </PAGE> 
     </PAGE> 
    </PAGE> 
</PAGE> 

Я хочу вернуть

"ID0001.4" 
"ID0003.1" 
"ID0012.9" 

и не

"ID0004" 
"ID0007.8" 
"ID0009.2" 

Я начал использовать .iter. Но это не поддерживает список родителей. Так что я попытался удвоить .iter и удалить детей, которые, на самом деле не работает ...

Я предполагаю, что я должен написать рекурсивную .findall но действительно надеялся там было более элегантное решение, которое я вид. Рекурсия .findall была бы необходима, так как я не знаю, как глубоко дерево идет.

ответ

-1

Используйте питона ElementTree XML API

x='''<root><PAGE ID='ID0001.4'> 
</PAGE> 
<PAGE> 
</PAGE> 
<PAGE ID="ID0003.1"> 
<PAGE> 
    <PAGE ID="ID0004"> 
     <PAGE ID="ID0007.8"> 
     </PAGE> 
    </PAGE> 
</PAGE> 
</PAGE> 
<PAGE> 
<PAGE> 
    <PAGE ID="ID0012.9"> 
     <PAGE ID='ID0009.2'> 
     </PAGE> 
    </PAGE> 
</PAGE> 
</PAGE></root>''' 


import xml.etree.ElementTree as ET 
tree = ET.fromstring(x) 
for i in tree.iter('PAGE'): 
    if i.attrib;print i.attrib 

Выход:

{'ID': 'ID0001.4'} 
{'ID': 'ID0003.1'} 
{'ID': 'ID0004'} 
{'ID': 'ID0007.8'} 
{'ID': 'ID0012.9'} 
{'ID': 'ID0009.2'} 
+0

Это не ответ на мой вопрос, я не хочу, чтобы вернуться "ID0004" "ID0007.8" " ID0009.2" – Bart

Смежные вопросы