findall()
不支持XPath表達式,只有ElementPath(見http://effbot.org/zone/element-xpath.htm)。 ElementPath不支持搜索包含特定字符串的元素。
爲什麼不使用XPath?假設文件test.xml
包含示例XML,以下工作:
> python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> tree=etree.parse("test.xml")
>>> tree.xpath("Confirmation[starts-with(TransactionId, 'GTEREVIEW')]")
[<Element Confirmation at 0x7f68b16c3c20>]
如果你堅持要用findall()
,你能做的最好的就是有TransactionId
子節點的所有Confirmation
元素的列表:
>>> tree.findall("Confirmation[TransactionId]")
[<Element Confirmation at 0x7f68b16c3c20>, <Element Confirmation at 0x7f68b16c3ea8>]
然後您需要手動過濾此列表,如:
>>> [e for e in tree.findall("Confirmation[TransactionId]")
if e[0].text.startswith('GTEREVIEW')]
[<Element Confirmation at 0x7f68b16c3c20>]
如果您的文檔CON含有雜質的命名空間,下面將讓你有TransactionId
子節點的所有Confirmation
元素,前提是該元素使用默認的命名空間(我用xmlns="file:xyz"
作爲默認的命名空間):
>>> tree.findall("//{{{0}}}Confirmation[{{{0}}}TransactionId]".format(tree.getroot().nsmap[None]))
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>, <Element {file:xyz}Confirmation at 0x7f534a85d128>]
而且當然還有etree.ETXPath
的:
>>> find=etree.ETXPath("//{{{0}}}Confirmation[starts-with({{{0}}}TransactionId, 'GTEREVIEW')]".format(tree.getroot().nsmap[None]))
>>> find(tree)
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>]
這使您可以組合XPath和名稱空間。
其中是您的xml文件? – SomeDude
我已更新問題。 – naiminp