Python lxml库中的XPath函数:介绍Python中lxml库支持的XPath函数,包括XPath 1.0、2.0、3.0中的函数,以及lxml库自己扩展的函数。

2023-04-17 00:00:00 函数 扩展 库中

lxml库是Python中一个非常强大的XML处理库,其中包含了许多XPath函数来方便地处理XML文档。以下是lxml库支持的一些XPath函数:

XPath 1.0函数:

  1. string(expr): 把一个表达式的值转换为字符串类型。
  2. concat(str1, str2, …): 把几个字符串拼接在一起。
  3. contains(str1, str2): 判断str1是否包含str2,返回布尔类型。
  4. count(expr): 返回节点集合的数量。
  5. normalize-space(str): 把字符串中多余的空格删除,返回新字符串。
  6. starts-with(str1, str2): 判断str1是否以str2开头,返回布尔类型。

代码演示:

from lxml import etree

# 创建一个XML文档
root = etree.Element("pidancode")
child1 = etree.SubElement(root, "top")
child2 = etree.SubElement(child1, "mid")
child3 = etree.SubElement(child2, "bottom")
# 添加文本内容
child3.text = "皮蛋编程"
# 将文档转换为字符串
xml_str = etree.tostring(root, encoding="utf-8")

# 创建XPath解析器
parser = etree.XMLParser()
tree = etree.fromstring(xml_str, parser)
# 打印文档的字符串形式
print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode())

# 使用XPath 1.0函数
print(tree.xpath("string(//bottom)"))  # 皮蛋编程
print(tree.xpath("concat('pidancode.com', ':', //bottom)"))  # pidancode.com:皮蛋编程
print(tree.xpath("contains(//bottom, '编程')"))  # True
print(tree.xpath("count(//bottom)"))  # 1
print(tree.xpath("normalize-space('  皮蛋编程   ')"))  # 皮蛋编程
print(tree.xpath("starts-with(//bottom, '皮蛋')"))  # True

XPath 2.0函数:

  1. lower-case(str): 把字符串中的大写字母转换为小写字母。
  2. upper-case(str): 把字符串中的小写字母转换为大写字母。
  3. matches(str, pattern): 判断str是否匹配正则表达式pattern,返回布尔类型。
  4. replace(str, pattern, replacement): 把str中匹配正则表达式pattern的部分替换为replacement。

代码演示:

from lxml import etree
import re

# 创建一个XML文档
root = etree.Element("pidancode")
child1 = etree.SubElement(root, "top")
child2 = etree.SubElement(child1, "mid")
child3 = etree.SubElement(child2, "bottom")
# 添加文本内容
child3.text = "皮蛋编程"
# 将文档转换为字符串
xml_str = etree.tostring(root, encoding="utf-8")

# 创建XPath解析器
parser = etree.XMLParser()
tree = etree.fromstring(xml_str, parser)
# 打印文档的字符串形式
print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode())

# 使用XPath 2.0函数
print(tree.xpath("lower-case(//bottom)"))  # 皮蛋编程
print(tree.xpath("upper-case(//bottom)"))  # 皮蛋编程
print(tree.xpath("matches(//bottom, '编程')"))  # True
print(tree.xpath("replace(//bottom, '编程', '教育')"))  # 皮蛋教育

XPath 3.0函数:

  1. array:size(arr): 返回数组arr的长度。
  2. tokenize(str, pattern): 把字符串切割成数组,使用正则表达式pattern指定切割规则。
  3. map:keys(map): 返回字典map的所有键。
  4. map:get(map, key): 返回字典map中键为key的值。

代码演示:

from lxml import etree

# 创建一个XML文档
root = etree.Element("pidancode")
child1 = etree.SubElement(root, "top")
child2 = etree.SubElement(child1, "mid")
child3 = etree.SubElement(child2, "bottom")
# 添加文本内容
child3.text = "皮蛋编程"
# 将文档转换为字符串
xml_str = etree.tostring(root, encoding="utf-8")

# 创建XPath解析器
parser = etree.XMLParser()
tree = etree.fromstring(xml_str, parser)
# 打印文档的字符串形式
print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode())

# 使用XPath 3.0函数
print(tree.xpath("array:size(('pidancode.com', '皮蛋编程'))"))  # 2
print(tree.xpath("tokenize('Python is fun!', '\W')"))  # ['Python', 'is', 'fun', '']
print(tree.xpath("map:keys(map{x: 1, y: 2, z: 3})"))  # ['x', 'y', 'z']
print(tree.xpath("map:get(map{x: 1, y: 2, z: 3}, 'y')"))  # 2

lxml库自己扩展的函数:

  1. fn:exists(node): 判断节点node是否存在,返回布尔类型。
  2. fn:parent(node): 返回节点node的父节点。
  3. fn:children(node): 返回节点node的子节点。
  4. fn:is-root(node): 判断节点node是否为根节点,返回布尔类型。

代码演示:

from lxml import etree

# 创建一个XML文档
root = etree.Element("pidancode")
child1 = etree.SubElement(root, "top")
child2 = etree.SubElement(child1, "mid")
child3 = etree.SubElement(child2, "bottom")
# 添加文本内容
child3.text = "皮蛋编程"
# 将文档转换为字符串
xml_str = etree.tostring(root, encoding="utf-8")

# 创建XPath解析器
parser = etree.XMLParser()
tree = etree.fromstring(xml_str, parser)
# 打印文档的字符串形式
print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode())

# 使用lxml库自己扩展的函数
print(tree.xpath("fn:exists(//bottom)"))  # True
print(tree.xpath("fn:parent(//bottom)"))  # <Element mid at 0x7f8b83...
print(tree.xpath("fn:children(//mid)"))  # [<Element bottom at 0x7f8b846...]
print(tree.xpath("fn:is-root(//bottom)"))  # False
print(tree.xpath("fn:is-root(/)"))  # True

相关文章