2017-08-25 10 views
0

は、私はいくつかのガイドを参照しているが、私はまだそれが難しいこの(Pythonの初心者くさい)のまわりで私の頭をラップするために見つけることだ:ベストプラクティス - XML APIレスポンスの解析 - Pythonの3

  • /docs.python.org /3.7/library/xml.etree.elementtree.html
  • /effbot.org/zone/element-xpath.htm

xml output example

意図は、郵便番号のテキスト値を取得することです。

from xml.etree import ElementTree as ET 

tree = ET.parse(<destination_of_xml>.xml') 

for elem in tree.iterfind('/response/results/result/address/zipcode'): 
    print(elem.tag, elem.text) 
---------------------------------------------------------------------- 
output: 
zipcode {90292} 
zipcode {90292} 
... 

は何ですか:ここ

/SearchResults:searchresults[@xmlns:xsi="http://www.w3.org/2001/XMLSchema- 
instance"]/response/results/result/address/zipcode/text() 

ローカルファイルから働いているものの例です:しかし、私は前とガイドを参照してからこれを行っていない、私は次のXPathの出力が欲しいですこのインスタンスで郵便番号の値を取得し、将来のスキーマ変更を考慮する(つまり、要素zipcodeを見つけるまでXMLを反復する)良い方法ですか?これには良い解決策がありますか?

+0

私は本当に一般的な答えがあると疑います。郵便番号には必ず「郵便番号」というタグが付いているわけではありません。正当な5桁の郵便番号の値を探すことができますが、その後は長い郵便番号のバージョンがあることを注意しなければなりません。それ以外にも、ビジネスのエントリに2つ以上の郵便番号が含まれることがあります。どちらを受け入れるのですか?または私はあなたの質問のポイントを見逃していますか? –

+0

まあ、この例では、私はこのXMLソースから、郵便番号は常に '郵便番号'というタグを持つと仮定しています。しかし、必ずしも/ response/results/result/address/zipcodeの下に入れ子になっているとは限りません。例えば、ホストが何かを更新し、/ response/results/result/zipcodesの下に郵便番号があります。 –

+0

回答が要件を満たしている場合は、「受け入れ」と記入してください。 –

答えて

0

xpath式について知っておく必要があります。

私は、より単純なXML階層を解析するためにlxmlライブラリを使用しています。実際にはzipcode要素(注:複数)のドキュメントの先頭からどこにでも表示されるxpath式を書くことができるので、要素の上にあるものを知る必要はありません。.//zipcode。これにより要素が生成されます。今私はそれらを持っている、私はそこに一つだけがあることを知っているので、私は最初のものを選択し、そのtextを取得し、先頭と末尾の空白を削除します。

要素の名前が変わらないことを提供する...

>>> from xml.etree import ElementTree as ET 
>>> from lxml import etree 
>>> tree = etree.fromstring('''\ 
... <company> 
...  <name>XYZ</name> 
...  <industry>chemicals</industry> 
...  <address> 
...   <street> 
...    14234 Onyx Drive West 
...   </street> 
...   <city> 
...    Ainslie 
...   </city> 
...   <state> 
...    Idaho 
...   </state> 
...   <zipcode> 
...    87734 
...   </zipcode> 
...  </address> 
... </company>''') 
>>> tree.xpath('.//zipcode') 
[<Element zipcode at 0xb5e9c8>] 

>>> tree.xpath('.//zipcode')[0].text.strip() 
'87734'