python minidom - 从父节点获取具有相同名称的数据

时间:2015-03-11 06:40:29

标签: python xml parsing dom minidom

我有一个具有这种结构的xml文件:

<zone id=1 name=one>
  <subzone>
    <zone id=2 name=subone>
      ...
        <item>
        <item>
        ...

<zone id=1 name=two>
  <subzone>
    <zone id=2 name=subtwo>
      ...
        <item>
        <item>
        ...

我想获得所有项目的列表,其中包含有关其父母的信息。例如 - item, zone_id=1, zone_name=two, subzone_id=2, subzone_name=subtwozone组的items个节点数量不同。 我可以获得所有区域的列表:

def read_region(self, xml):
    doc = minidom.parse(xml)
    node = doc.getElementsByTagName("zone")
    for zone in node:
        print(zone.getAttribute("name"))

如果有很多节点具有相同的节点名,我如何从特定节点获取数据?或者是否可以获取有关元素的所有父节点的信息?

2 个答案:

答案 0 :(得分:1)

你问两个问题:

  1. 如何从同名的多个元素中获取特定元素?
  2. 如何获取给定元素的所有父元素?

    1. 要获取特定元素,您必须确定 与该元素不同的内容。它可以是与唯一可识别的另一个元素的关系。

    2. 您可以通过重复调用node.getparent()来获取元素的所有父母,如下所示。见http://lxml.de/api/lxml.etree._Element-class.html

      def get_parents(element):
          ancestors = []
          parent = element.getparent()
          while parent != None:
              ancestors.append(parent)
              parent = parent.getparent()
          return ancestors
      

答案 1 :(得分:0)

我找到了答案:

def read_region(self, xml):
        doc = minidom.parse(xml)
        node = doc.getElementsByTagName("Zone")
        data_array = []
        for zone in node:
            zone_child = zone.getElementsByTagName("Zone")
            if len(zone_child)==0:
                print(zone.getAttribute("name"))
                subzone_parent = zone.parentNode
                zone_parent = subzone_parent.parentNode
                print(zone_parent.getAttribute("name"))

                subzone_parent_parent = zone_parent.parentNode
                zone_parent_parent = subzone_parent_parent.parentNode
                print(zone_parent_parent.getAttribute("name"))

                subzone_top = zone_parent_parent.parentNode
                zone_top = subzone_top.parentNode
                try:
                    print(zone_top.getAttribute("name"))
                except Exception,e:
                    print("DEBUG")

我检查Zone节点中没有子节点并获取该节点的每个父节点。