使用xml.etree.ElementTree在任何嵌套深度搜索通配符

时间:2015-07-24 07:57:36

标签: python xml-parsing elementtree

我有一组XML文件,其中包含

等条目
   <group name="XXX common string">

      <value val="12" description="a dozen">
         <text>one less than a baker's dozen</text>
      </value>

      <value val="13" description="a baker's dozen">
         <text>One more than a dozen</text>
      </value>

   </group>

   <group name="YYY common string">

      <value val="42" description="the answer">
         <text>What do you get if you multiple 6 by 9?</text>
      </value>

   </group>

有没有简单的方法,使用import xml.etree.ElementTree as ET

    parser = ET.XMLParser()
    parser.parser.UseForeignDTD(True)

    if (args.info) or (args.diagnostics):
        print('Parsing input file : ' + inputFileName)

    tree = ET.parse(inputFileName, parser=parser)
    root = tree.getroot()

仅搜索#s名称包含的<group>元素&#34;普通字符串&#34;对于特定的value val

重要提示:这些组嵌套在不同文件的不同深度。

2 个答案:

答案 0 :(得分:1)

这有点困难,因为你自己的代码无法使用 您在问题中发布的示例数据(例如,其中没有任何内容 字符串error,没有id属性和您的代码 似乎没有搜索“特定的value val 成为你的要求之一)。但这里有一些想法......

要查找group属性中包含common string的所有name元素,您可以执行以下操作:

>>> matching_groups = []
>>> for group in tree.xpath('//group[contains(@name, "common string")]'):
...   matching_groups.append[group]
...

给出您的样本数据会导致:

>>> print '\n'.join([etree.tostring(x) for x in matching_groups])
<group name="XXX common string">

      <value val="12" description="a dozen">
         <text>one less than a baker's dozen</text>
      </value>

      <value val="13" description="a baker's dozen">
         <text>One more than a dozen</text>
      </value>

   </group>


<group name="YYY common string">

      <value val="42" description="the answer">
         <text>What do you get if you multiple 6 by 9?</text>
      </value>

   </group>

如果您想将结果限制为仅group元素 包含属性value == val的{​​{1}}元素,您可以尝试:

42

哪会产生:

>>> matching_groups = []
>>> for group in tree.xpath('//group[contains(@name, "common string")][value/@val = "42"]'):
...     matching_groups.append(group)
... 

答案 1 :(得分:0)

问题是1)组名的通配符搜索,以及2)组在不同文件中嵌套在不同级别的事实。

我实现了这种强力方法,在文件中任何位置的名为group的错误中构建所有此类错误条目的字典。

我把它留给后人,并邀请更多的大象解决方案。

    import xml.etree.ElementTree as ET

    parser = ET.XMLParser()
    parser.parser.UseForeignDTD(True)

    tree = ET.parse(inputFileName, parser=parser)
    root = tree.getroot()

    args.errorDefinitions = {}
    for element in tree.iter():
        if element.tag == 'group':
            if 'error' in element.get('name').lower():
                if element._children:
                    for errorMessage in element._children[0]._children:
                        args.errorDefinitions[errorMessage.get('name')] = \
                                  {'id':  errorMessage.get('id'), \
                                  'description': element._children[0].text}