使用xpath查找包含特定文本的xml元素,或者使用lxml在python中查找

使用xpath查找包含特定文本的xml元素,或者使用lxml在python中查找,python,xpath,lxml,Python,Xpath,Lxml,我正在尝试查找所有具有值的book元素abc,即name标记值。我使用了xpath: val=xml1.xpath('//bookstore/book/name[text()=“abc”]) 但它却一无所获 <bookstore> <book> <name>abc</name> <price>30</price> </book> <book> <name>Learn

我正在尝试查找所有具有值的
book
元素
abc
,即
name
标记值。我使用了xpath:

val=xml1.xpath('//bookstore/book/name[text()=“abc”])

但它却一无所获

<bookstore>
 <book>
   <name>abc</name>
   <price>30</price>
 </book>
 <book>
   <name>Learning XML</name>
   <price>56</price>
 </book>
</bookstore> 

abc
30
学习XML
56

将Id属性添加到图书标签

root.xpath(“//bookstore/book/name[text()='abc']
它将给出所有
name
元素的列表,其中
text
不是父元素

检查以下内容:

>>> data = """<bookstore>
...  <book id="1">
...    <name>abc</name>
...    <price>30</price>
...  </book>
...  <book id="2">
...    <name>Learning XML</name>
...    <price>56</price>
...  </book>
... </bookstore> """
>>> root = PARSER.fromstring(data)
>>> root.xpath("//bookstore/book")
[<Element book at 0xb726d144>, <Element book at 0xb726d2d4>]
>>> root.xpath("//bookstore/book/name[text()='abc']")
[<Element name at 0xb726d9b4>]
>>> root.xpath("//bookstore/book/name[text()='abc']/parent::*")
[<Element book at 0xb726d7d4>]
>>> root.xpath("//bookstore/book/name[text()='abc']/parent::*")[0].attrib
{'id': '1'}

以下是一种方法:

from lxml import etree

# Create an ElementTree instance 
tree = etree.parse("bookstore.xml")  

# Get all 'book' elements that have a 'name' child with a string value of 'abc'
books = tree.xpath('book[name="abc"]')

# Print name and price of those books
for book in books:
    print book.find("name").text, book.find("price").text
使用问题中的XML时的输出:

abc 30

就我所知,发布的XPath应该可以工作。可能问题是您的实际XML具有默认名称空间,不是吗?问题中的XPath选择
name
元素。我的解释是OP希望
book
元素具有具有特定值的
name
子元素。
abc 30