【问题标题】:XML parsing in python multi level tagspython多级标签中的XML解析
【发布时间】:2017-02-09 00:00:20
【问题描述】:

我正在尝试从具有多级标签的 xml 文件中提取字段。在下面的例子中,

  <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

【问题讨论】:

    标签: python xml xml-parsing


    【解决方案1】:

    解决办法如下:

    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)
    

    【讨论】:

    • 这只是为我打印一个空列表。
    • 很可能,您的根元素中有一个命名空间,或者不是根的直接子元素。我的代码基于关于您的上下文的未显示假设。请显示完整的 XML 结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2012-12-18
    • 2018-06-09
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多