2017-02-09 3 views
0

Я пытаюсь извлечь поля из XML-файла с несколькими уровнями тегов. В следующем примереXML-синтаксический анализ в многоуровневых тегах python

<compound kind="struct"> 
    <name>my-struct</name> 
    <filename>struct____dt__args.html</filename> 
    <member kind="variable"> 
     <type>int32_t</type> 
     <name>count</name> 
     <anchorfile>struct____dt__args.html</anchorfile> 
     <anchor>a0fbe49d8b1189286bd817409658eb631</anchor> 
     <arglist></arglist> 
    </member> 
    <member kind="variable"> 
     <type>int32_t</type> 
     <name>create_type</name> 
     <anchorfile>struct____dt__args.html</anchorfile> 
     <anchor>a4e38c7f138891d020cce3c6d7e6bc31e</anchor> 
     <arglist></arglist> 
    </member> 
    <member kind="variable"> 
     <type>size_t</type> 
     <name>total_size</name> 
     <anchorfile>struct____dt__args.html</anchorfile> 
     <anchor>a41ca25bca63ad1fee790134901d8d1c0</anchor> 
     <arglist></arglist> 
    </member> 
    </compound> 

Мне нужно разобрать это и извлечение полого тега «соединения» (имеется несколько составных тегов с различными видами структуры/функция/класса и т.д.), я нужен только Kind = STRUCT теги за которым следует тип и имя тегов его дочерних элементов.

struct my-struct: 
int32_t count 
int32_t create_type 
size_t total_size 

ответ

0

Вот решение:

from xml.etree import ElementTree 


def extract_structs(xml_path): 
    # data and xml structure validation omitted 
    # result collected as lists and tuples without string formatting 
    struct_list = [] 
    root = ElementTree.parse(xml_path).getroot() 
    for compound in root: 
     kind = compound.get('kind') 
     if kind != 'struct': 
      continue 
     current_struct = [] 
     struct_list.append(current_struct) 
     struct_name = compound.find('./name').text 
     current_struct.append((kind, struct_name)) 
     for member in compound.findall('./member'): 
      member_type = member.find('./type').text 
      member_name = member.find('./name').text 
      current_struct.append((member_type, member_name)) 
    return struct_list 


if __name__ == '__main__': 
    structs = extract_structs('test_file.xml') 
    print(structs) 
+0

Это печатает только пустой список для меня. – marc

+0

Возможно, у вас есть пространство имен внутри вашего корневого элемента или не является прямым дочерним элементом root. Мой код был основан на непредставленных предположениях о вашем контексте. Покажите полную структуру XML, пожалуйста. –

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