检查 ElementTree 的每个值

Check every value of an ElementTree

我正在使用 python 中的 ElementTree 解析 XML,我必须检查我的树中的每个浮点数是否都带有“,”而不是“。”但我不知道如何到达我的树的每个 child,它是从 xml 的 +100K 行创建的,非常大。

这是一个非常短的样本但是:

<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我们可以通过以下方式进行:

  1. 创建 xml.etree.ElementTree.Element 的根对象。
  2. 通过 getiterator() 方法迭代输入中的每个元素。
  3. 使用 re 检查文本是由 . or , 分隔的数字。
  4. 如果是,则添加到结果列表。
  5. 显示结果列表。

演示:

>>> 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

或:

最好检查元素是否 None。

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)

注:

  1. 这是基本代码,您可以根据自己的算法条件进行修改。
  2. 使用lxml库解析xml数据。
  3. 做必要的异常处理。