检查ElementTree的每个值
我在Python中用ElementTree解析XML,并且必须检查树中的每个浮点数是否都带有“,”而不是“。”。但我不知道如何到达我的树的每个孩子,这是从一个+ 100K行的XML创建非常大。检查ElementTree的每个值
这是一个很短的样品,不过:
<example tr="3,1">
<test>2.1</test>
<stack>
<nb>2,5</nb>
<nb>5.1</nb>
</stack>
</example>
我想检查,如果这是一个浮动的任何值是用逗号或一个点。我的问题是要用任何一棵树达到一棵树的每个价值。
到目前为止,我尝试这样做:
tree = ET.parse(chemin, parser=LineNumberingParser())
root = tree.getroot()
float_text_info = []
for element in root.getiterator():
if element is not None:
element_value = element.text.strip()
if element_value and re.findall('\d+[\.|,]\d+', element_value):
float_text_info.append(element_value)
通过ElementTree
我们可以在下面的方式做:
- 创建的
xml.etree.ElementTree.Element
根对象。 - 通过
getiterator()
方法从输入中遍历每个元素。 - 使用
re
检查文本是由. or ,
分开的数字。 - 如果是,则添加到结果列表。
- 显示结果列表。
演示:
>>> data = """
... <example tr="3,1">
... <test>2.1</test>
... <stack>
... <nb>2,5</nb>
... <nb>5.1</nb>
... </stack>
... </example> """
>>>
>>>
>>> import xml.etree.ElementTree as PARSER
>>> import re
>>>
... root = PARSER.fromstring(data)
>>>
>>> float_text_info = []
>>> for element in root.getiterator():
... element_value = element.text.strip()
... if element_value and re.findall('\d+[\.|,]\d+', element_value):
... float_text_info.append(element_value)
...
...
>>> print "float_text_info:", float_text_info
float_text_info: ['2.1', '2,5', '5.1']
做异常处理当存在XML注释。
try:
element_value = element.text.strip()
except:
continue
或者:
最好检查元素无与否。
for element in root.getiterator():
if element is not None and element.text is not None:
element_value = element.text.strip()
if element_value and re.findall('\d+[\.|,]\d+', element_value):
float_text_info.append(element_value)
注:
- 这是基本的代码,你可以根据你的算法条件进行修改。使用
lxml
库来解析xml数据。 - 做必要的异常处理。
谢谢你的答案!所以它确实适用于这个小树,但我的方式更大更困难,所以它不起作用。我想我必须浏览我树的每个值才能做到这一点。我为什么要用'lxml'?我正在与工业规范合作,要求我使用'ElementTree' –
nope,它也适用于大文档。大文档的脚本失败了吗? 'lxml'比'ElementTree'更加强大' –
它对我说: '回溯(最近的通话最后): 文件“VerifReports。py“,第89行,在
你能提供样本输入和你试试吗? –
请编辑您的问题以包含您的示例,而不是在评论中回答。你还可以向我们展示你迄今为止的尝试吗? –
好吧..我进入了算法,以达到我的树的每个价值,但我不知道它是否是好主意,因为它的能量vore ..也许东西已经存在 –