2017-02-09 5 views
1

XMLファイルの複数のレコードからデータを抽出するスクリプトを作成してPythonを学習しようとしています。 Web上で検索することでほとんどの質問に対する答えを見つけることができましたが、getElementsByTagName( "タグ名")[0]の前にXMLタグにデータが含まれていないかどうかを判断する方法が見つかりませんでした。 .dataメソッドが使用され、データが存在しないときにAttributeErrorがスローされます。私は試して私のコードを書くことができ、AttributeErrorを処理することができますが、私は例外を処理する必要がないデータを抽出しようとする前に、タグが空であることを知りたいと思います。 タグ内にデータを持ち、タグが空の2つのレコードを含むXMLファイルの例を次に示します。ここでPython 3.6を使用したXMLの解析XMLタグにデータが含まれていないかどうかを確認するには

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<records> 
    <rec> 
    <name>ZYSRQPO</name> 
    <state>Washington</state> 
    <country>United States</country> 
    </rec> 
    <rec> 
    <name>ZYXWVUT</name> 
    <state></state> 
    <country>Mexico</country> 
    </rec> 
</records> 

は、私がデータを抽出するために使用する可能性のあるコードのサンプルです:このファイルを処理するとき

from xml.dom import minidom 
import sys 

mydoc = minidom.parse('mydataFile.xml') 
records = mydoc.getElementsByTagName("rec") 

for rec in records: 
    try: 
     name = rec.getElementsByTagName("name")[0].firstChild.data 
     state = rec.getElementsByTagName("state")[0].firstChild.data 
     country = rec.getElementsByTagName("country")[0].firstChild.data 
     print('{}\t{}\t{}'.format(name, state, country)) 

    except (AttributeError): 
     print('AttributeError encountered in record {}'.format(name), file=sys.stderr) 
     continue 

ZYXWVUTという名前の記録のための情報は、例外が発生したことを除いて印刷されません。私は、使用された州名とこのレコードについて印刷された残りの情報にヌル値を持たせたいと思っています。 if文を使用してgetElementsByTagNameを使用する前にタグにデータが含まれていないかどうかを判断し、データが見つからないときにエラーが発生するように、私が望むことを行うために使用できるメソッドはありますか?

答えて

1
from xml.dom import minidom 
import sys 

mydoc = minidom.parse('mydataFile.xml') 
records = mydoc.getElementsByTagName("rec") 

for rec in records: 
    name = rec.getElementsByTagName("name")[0].firstChild.data 
    state = None if len(rec.getElementsByTagName("state")[0].childNodes) == 0 else rec.getElementsByTagName("state")[0].firstChild.data 
    country = rec.getElementsByTagName("country")[0].firstChild.data 
    print('{}\t{}\t{}'.format(name, state, country)) 

またはいずれかのチャンスがある場合は、その名前と国があまりにも空である:

from xml.dom import minidom 
import sys 


def get_node_data(node): 
    if len(node.childNodes) == 0: 
     result = None 
    else: 
     result = node.firstChild.data 
    return result 


mydoc = minidom.parse('mydataFile.xml') 
records = mydoc.getElementsByTagName("rec") 

for rec in records: 
    name = get_node_data(rec.getElementsByTagName("name")[0]) 
    state = get_node_data(rec.getElementsByTagName("state")[0]) 
    country = get_node_data(rec.getElementsByTagName("country")[0]) 
    print('{}\t{}\t{}'.format(name, state, country)) 
+0

は、私はあなたの応答に感謝、ありがとうございます。私は特に2番目の提案が好きですが、名前や国が空になる可能性はほとんどありませんが、よりエレガントな構造を探すためにはほとんどチャンスはありません。私は今どこにいても私は今あるべきだから、私はこれを試していないが、できるだけ早く試してみるだろう。 – JCB

0

私はreedcourtyの第二の提案を試してみましたが、それがとてもうまくいったことがわかりました。しかし、私は要素が空であれば本当に返されることを望んでいないと決めました。これは、このXMLに対して実行された場合

from xml.dom import minidom 
import sys 

def get_node_data(node): 
    if len(node.childNodes) == 0: 
     result = '*->No ' + node.nodeName + '<-*' 
    else: 
     result = node.firstChild.data 
    return result 

mydoc = minidom.parse(dataFileSpec) 
records = mydoc.getElementsByTagName("rec") 

for rec in records: 
    name = get_node_data(rec.getElementsByTagName("name")[0]) 
    state = get_node_data(rec.getElementsByTagName("state")[0]) 
    country = get_node_data(rec.getElementsByTagName("country")[0]) 
    print('{}\t{}\t{}'.format(name, state, country)) 

:ここに私が思い付いたものです

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<records> 
    <rec> 
    <name>ZYSRQPO</name> 
    <country>United States</country> 
    <state>Washington</state> 
    </rec> 
    <rec> 
    <name></name> 
    <country>United States</country> 
    <state>Washington</state> 
    </rec> 
    <rec> 
    <name>ZYXWVUT</name> 
    <country>Mexico</country> 
    <state></state> 
    </rec> 
    <rec> 
    <name>ZYNMLKJ</name> 
    <country></country> 
    <state>Washington</state> 
    </rec> 
</records> 

それは、この出力を生成します

ZYSRQPO Washington  United States 
*->No name<-* Washington  United States 
ZYXWVUT *->No state<-* Mexico 
ZYNMLKJ Washington  *->No country<-* 
関連する問題