2012-03-19 51 views
0

我試圖從XML文檔中解析出某些標籤,並且它將退出AttributeError: '_ElementStringResult' object has no attribute 'text'錯誤。Python lxml:查詢節點時返回沒有.text屬性的項目()

這裏是XML文檔:

<?xml version='1.0' encoding='ASCII'?> 
<Root> 
    <Data> 
    <FormType>Log</FormType> 
    <Submitted>2012-03-19 07:34:07</Submitted> 
    <ID>1234</ID> 
    <LAST>SJTK4</LAST> 
    <Latitude>36.7027777778</Latitude> 
    <Longitude>-108.046111111</Longitude> 
    <Speed>0.0</Speed> 
    </Data> 
</Root> 

這裏是我使用

from lxml import etree 
from StringIO import StringIO 
import MySQLdb 
import glob 
import os 
import shutil 
import logging 
import sys 

localPath = "C:\data" 
xmlFiles = glob.glob1(localPath,"*.xml") 
for file in xmlFiles: 
    a = os.path.join(localPath,file) 
    element = etree.parse(a) 

    Data = element.xpath('//Root/Data/node()') 
    parsedData = [{field.tag: field.text for field in Data} for action in Data] 




print parsedData #AttributeError: '_ElementStringResult' object has no attribute 'text' 

回答

2

'//Root/Data/node()'將返回所有子元素,其中包括文本元素作爲字符串列表的代碼不會有一個text屬性。如果你在Data = ...後面打印,你會看到類似['\n ', <Element FormType at 0x10675fdc0>, '\n ', ...的東西。

如我首先做一個過濾器:

Data = [f for f in elem.xpath('//Root/Data/node()') if hasattr(f, 'text')] 

那麼我想下面的行可能會被改寫爲:

parsedData = {field.tag: field.text for field in Data} 

這將給元素標籤和文字的字典,我相信是你想要的。

+0

+1用於診斷問題,但最好是修改查詢而不是保留現有的並過濾其結果。 – 2012-03-19 14:35:22

2

而不是查詢//Root/Data/node(),查詢/Root/Data/*如果您只想返回元素(而不是文本節點)。 (另外,只使用一個單一的領導/,而不是//使發動機做更便宜的搜索,而不需要通過整個子樹以尋找額外的Root

而且 - 你確定你真的循環遍歷內部循環中Data的子元素的整個列表,而不是循環遍歷外部循環選擇的單個Data元素的子元素?我認爲你的邏輯被破壞了,儘管只有當你有一個文件與多個Data元素在Root

+0

這是比我的元素更好的方法。 +1 – 2012-03-19 14:51:56

+0

xml文件將只有一個數據元素。我如何修復邏輯? – lodkkx 2012-03-19 15:10:32

+0

@lodkkx如果每個文件只有一個數據元素,那麼它就不那麼重要......但是我更喜歡蘭斯答案中的'parsedData'這一行。 – 2012-03-19 15:41:55