2016-07-07 1 views
0

私は現在、解析しようとしているXMLファイルを持っています。ここまで私のコードです。複数の子供が名前を共有するときにPythonでXMLを解析する

from xml.etree import ElementTree 

with open('data.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 

for node in tree.iter('Host'): 
    hostname = node.find('Name').text 
    ip = node.find('Networking/IP').text 
    print hostname 
    print ip 

しかし、これらのデバイスの全てが3つのIPアドレスを持っているので、私は問題に実行していますので、まったく同じ名前を持つ複数のXML「子ども」があります。ここだから私のテストスクリプトは、最初のIPをサンプル(実際のホスト名が遮ら)

<?xml version="1.0" encoding="UTF-8"?> 
<APIResponse> 
    <HostRecords> 
    <Type>Dedicated</Type> 
     <Host> 
     <Name>dc-01-a.domain.com</Name> 
     <Active>1</Active> 
     <Networking> 
      <Primary>Yes</Weight> 
      <IP>10.0.8.72</IP> 
     </Networking> 
     <Networking> 
      <Primary>No</Weight> 
      <IP>10.12.12.1</IP> 
     </Networking> 
     <Networking> 
      <Primary>Yes</Weight> 
      <IP>fd30:0000:0000:0001:ff4e:003e:0009:000e</IP> 
     </Networking> 
     </Host> 
    </Type> 
    </HostRecords> 
</APIResponse> 

を引き出しているが、どのように私は次の二つのIPアドレスを引くのですか? 'Networking/IP'は3つの点で全く同じものですが、1つだけ引っ張ります。また、プライマリとラベル付けされたIPしか取得できないようにするにはどうしたらいいですか?

編集:私は代わりに見つけるのにfindAllとしようとした場合、私は

AttributeError: 'list' object has no attribute 'text'

を取得し、私はテキスト部分を削除した場合、私は

[<Element 'RData' at 0x10ef67650>, <Element 'RData' at 0x10ef67750>, <Element 'RData' at 0x10ef67850>] 

を取得するだからではなく、実際の読み取り可能なデータとして返します。

+0

XML構造をチェックしてください。 3番目のNetworkingタグが間違っているようです。 – arcee123

+0

おそらく 'node.find()'の代わりに 'node.findall()'を使うでしょうか? –

+0

ああ、ありがとうございました。必要な関連データを会社のプライバシー目的のためにそこに残しながら、余分なデータの多くを妨害しようとしました。 – Mallachar

答えて

1

findメソッドを使用して、プライマリとしてマークされている唯一のIPアドレスを抽出するためにこれを使用することができ、いくつかの制限されたXPath式を受け入れることができます。

from xml.etree import ElementTree 
tree = ElementTree.fromstring(sample) 

for node in tree.iter('Host'): 
    hostname = node.find('Name').text 
    ips = node.findall("Networking[Primary='Yes']/IP") 
    print hostname 
    for ip in ips: 
     print ip.text 

XPath式が許可されているかの詳細についてのマニュアルを参照してください。https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element質問で提供


サンプルXMLは、(それは投稿のために難読化された、または与えられたコード例では、働いたことがない可能性があり、おそらく)エリアのカップルで不正な形式れます。タイプタグが2回閉じられ、プライマリタグがクローズウェイトタグと一致しない

関連する問題