2017-04-25 50 views
2

我在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) 
+0

你能提供樣本輸入和你試試嗎? –

+0

請編輯您的問題以包含您的示例,而不是在評論中回答。你還可以向我們展示你迄今爲止的嘗試嗎? –

+0

好吧..我進入了算法,以達到我的樹的每個價值,但我不知道它是否是好主意,因爲它的能量vore ..也許東西已經存在 –

回答

0

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

或者:

最好檢查元素無與否。

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. 這是基本的代碼,你可以根據你的算法條件進行修改。使用lxml庫來解析xml數據。
  2. 做必要的異常處理。
+0

謝謝你的答案!所以它確實適用於這個小樹,但我的方式更大更困難,所以它不起作用。我想我必須瀏覽我樹的每個值才能做到這一點。我爲什麼要用'lxml'?我正在與工業規範合作,要求我使用'ElementTree' –

+0

nope,它也適用於大文檔。大文檔的腳本失敗了嗎? 'lxml'比'ElementTree'更加強大' –

+0

它對我說: '回溯(最近的通話最後): 文件「VerifReports。py「,第89行,在 element_value = element.text.strip() AttributeError:'NoneType'對象沒有屬性'strip'' –