使用 xpath 查找具有某些特定文本的 xml 元素或使用 lxml 在 python 中查找

Find an xml element with some specific text using xpath or find in python using lxml

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

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

但它正在返回 None。

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

为图书标签添加了 Id 属性。

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

检查以下内容:

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

Python初学者:

  1. 从该数据创建解析对象。
  2. 定义父列表变量。
  3. 迭代 name 个标签。
  4. 检查 name 标签的 text 等于 abc
  5. 如果是,则获取 name 标记的父级并附加到列表变量。
  6. 显示结果:

代码:

>>> root = PARSER.fromstring(data)
>>> abc_parent = []
>>> for i in root.getiterator("name"):
...    if i.text=="abc":
...        abc_parent.append(i.getparent())
... 
>>> print abc_parent
[<Element book at 0xb726d2d4>]
>>> 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