我有一组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
?
重要提示:这些组嵌套在不同文件的不同深度。
答案 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}