使用 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
元素的列表,其中 text
是 abc
不是父元素。
检查以下内容:
>>> 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初学者:
- 从该数据创建解析对象。
- 定义父列表变量。
- 迭代
name
个标签。
- 检查
name
标签的 text
等于 abc
。
- 如果是,则获取
name
标记的父级并附加到列表变量。
- 显示结果:
代码:
>>> 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
我正在尝试查找所有 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
元素的列表,其中 text
是 abc
不是父元素。
检查以下内容:
>>> 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初学者:
- 从该数据创建解析对象。
- 定义父列表变量。
- 迭代
name
个标签。 - 检查
name
标签的text
等于abc
。 - 如果是,则获取
name
标记的父级并附加到列表变量。 - 显示结果:
代码:
>>> 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