2012-03-19 14 views
0

ノード()を照会し、それがAttributeError: '_ElementStringResult' object has no attribute 'text'エラーが引退したときの.text属性を持たないアイテムが返さ。ここで Pythonのlxmlのは:私は、XML文書から特定のタグを解析しようとしています

が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 ', ...のようなものが表示されます。

私のような第一のフィルタを行うだろう:私は信じている要素タグとテキスト辞書を与えるであろう

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

:その後、私は次の行のように書き換えることができると思い

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

あなたが欲しいものです。

+0

Rootの下に複数のData要素を持つファイルが、よりも、クエリを修正する方が良いと思います既存のものを保持してその結果をフィルタリングします。 –

2

//Root/Data/node()を照会する代わりに、要素(テキストノードではなく)のみを返すようにする場合は、/Root/Data/*を照会します。 (また、使用した唯一の大手/むしろ//よりはむしろ、追加Rootためサブツリー全体に目を通す必要がより、安く、検索を行うためにエンジンを可能

をも - 。あなたは本当にがよろしいです外側のループで選択された1つのデータ要素のサブ要素だけをループするのではなく、内側のループ内のデータのサブ要素のリスト全体をループするのですか?ロジックが壊れていると思います。問題を診断するための1

+0

これは、私のものよりも要素を得るためのより良い方法です。 +1 –

+0

xmlファイルのデータ要素は1つだけです。どのようにしてロジックを修正できますか? – lodkkx

+0

@lodkkxファイルごとに1つのデータ要素しかない場合、Lanceの答えの中の 'parsedData'の行が好きです。 –

関連する問題