最佳实践 - 解析 XML API 响应 - Python 3

Best practices - Parsing XML API response - Python 3

我已经参考了几个指南,但我仍然觉得很难理解这个问题(Python newb):

xml output example

目的是检索邮政编码文本值;但是,我之前和参考指南时都没有这样做,我想要以下 xpath 的输出:

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

这是一个从本地文件运行的示例:

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}
...

在这种情况下,检索邮政编码值并说明未来任何模式更改的最佳做法是什么(即遍历 XML 直到找到元素邮政编码)?有更好的解决方案吗?

您可能需要了解 xpath 表达式。

我正在使用 lxml 库来解析更简单的 xml 层次结构。我不需要知道 zipcode 元素上面的内容,因为我可以编写一个 xpath 表达式,实际上,从文档顶部的任何地方查找 zipcode 元素(注意,复数): .//zipcode。这产生了元素。现在我有了它们,因为我知道只有一个,我 select 'first',得到它的 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'