使用XPath查找文本元素賦予相同的XML如下:的ElementTree
<root>
<element>A</element>
<element>B</element>
</root>
我如何與內容匹配元素A,使用ElementTree的和XPath的支持?謝謝
使用XPath查找文本元素賦予相同的XML如下:的ElementTree
<root>
<element>A</element>
<element>B</element>
</root>
我如何與內容匹配元素A,使用ElementTree的和XPath的支持?謝謝
AFAIK ElementTree不支持XPath。它改變了嗎?
無論如何,你可以使用lxml及以下XPath表達式:
import lxml.etree
doc = lxml.etree.parse('t.xml')
print doc.xpath('//element[text()="A"]')[0].text
print doc.xpath('//element[text()="A"]')[0].tag
結果將是:
A
element
如果你想使用標準庫ElementTree,而不是LXML,你可以使用迭代來查找具有特定文本值的所有子元素。例如:
import sys
import xml.etree.ElementTree as etree
s = """<root>
<element>A</element>
<element>B</element>
</root>"""
e = etree.fromstring(s)
if sys.version_info < (2, 7):
found = [element for element in e.getiterator() if element.text == 'A']
else:
found = [element for element in e.iter() if element.text == 'A']
print found[0].text # This prints 'A', honestly!
注意:您可能需要執行列表中的理解你的元素的text
價值的一些剝離。
編輯這將適用於您的XML樹中的任何深度。例如,
s = """<root>
<element>A</element>
<element><sub>A</sub></element>
</root>"""
found = [element for element in e.getiterator() if element.text == 'A']
for f in found:
print f
將打印
<Element element at 7f20a882e3f8>
<Element sub at 7f20a882e4d0>
您可以使用XPath in ElementTree。沒有必要安裝任何lib。
config.findall('.//*[element="A"]/element')
由於從@Bionicegenius註釋波紋解釋說,上述只是表達的作品,如果你的元素沒有兄弟,但你得到的元素樹使用XPath的想法。
這有個問題選擇與所需節點相同級別上的所有元素。這將找到值爲A和B的兩個元素。 如果修改它以查找,則只會找到值爲A的元素,即使搜索B - 它也只會返回第一個子元素。 – Bioniclegenius
我選擇使用cElementTree而不是lxml,因爲對於我的任務它有更低的內存開銷(內存比CPU使用更重要),這是我從lxml移動所需的最後一部分代碼 – Patrick