XPath 学习笔记

XPath: 表达式使用路径表示法(与 URL 中使用的路径表示法类似)寻址 XML 文档的各个部分

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。

基本 XPath 表达式
当前上下文: 以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。
文档根: 以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。
根元素 : 使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。
递归下降 : 使用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。
特定元素 : 以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。


下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

1. XPath and Xml
最常见的XML数据类型有:Element, Attribute,Comment, Text.
Element, 指形如<Name>Tom<Name>的节点。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference.
Attribute, 指在<Employee name="">中的粗体部分。
Comment,指形如:<!-- my comment --> 的节点。
Text,指在<Name>Tom<Name>的粗体(Tom)部分。
在XML中,可以用XmlNode对象来参照各种XML数据类型。
2.1 查询已知绝对路径的节点(集) ----- SelectNodes、SelectSingleNode
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”)
或者
objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”)
以上两种方法可返回一个NodeList对象,如果要返回单个节点可使用SelectSingleNode方法,该方法如果查询到一个或多个节点,返回第一个节点;
如果没有查询的任何节点返回 Nothing。例如:
objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”)
If Not (objNode is Nothing) then
‘- Do process
End If
2.2 查询已知相对路径的节点(集)
可使用类似于文件路径的相对路径的方式来查询XML的数据
objNode = objDoc.SelectSingleNode(“Company/Department”)
objNodeList = objNode.SelectNodes(“../Department)
objNode = objNode.SelectNode(“Employees/Employee”)
2.3 查询已知元素名的节点(集)
在使用不规则的层次文档时,由于不知道中间层次的元素名,可使用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素。例如:
objNodeList = objDoc.SelectNodes(“Company//Employee”)
2.4 查询属性(attribute)节点
以上的各种方法都返回元素(element)节点(集),返回属性(attribute),只需要采用相应的方法,在属性名前加一个@符号即可,例如:
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”)
objNodeList = objDoc.SelectNodes(“Company//@id”)
2.5 查询Text节点
使用text()来获取Text节点。
objNode = objDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”)
2.6 查询特定条件的节点
使用[]符号来查询特定条件的节点。例如:
a. 返回id号为 10102的Employee节点
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)
b. 返回Name为Zhang Qi的Name 节点
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”)
c. 返回部门含有职员22345的部门名称节点
objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name")
3 XML数据的编辑
3.1 增加一个元素的属性(attribute)节点
Dim objNodeAttr As XmlNode
objNodeAttr = objDoc.CreateAttribute("id", Nothing)
objNodeAttr.InnerXml = "101"
objNode.Attributes.Append(objNodeAttr)
3.2 删除一个元素的属性
objNode.Attributes.Remove(objNodeAttr)
3.3 增加一个子元素(Element)
Dim objNodeChild As XmlNode
objNodeChild = objDoc.CreateElement(Nothing, "ID", Nothing)
objNodeChild.InnerXml = "101"
objNode.AppendChild(objNodeChild)
3.4 删除一个子元素
objNode.RemoveChild(objNodeChild)
3.5 替换一个子元素
objNOde.ReplaceChild(newChild,oldChild)
### 关于XPath学习笔记与教程 #### XPath简介 XPathXML Path Language)是一种用于在XML文档中定位和检索数据的语言。它可以通过路径表达式来导航XML树结构,从而获取所需的节点或属性[^3]。 #### 基础语法示例 以下是几个常见的XPath表达式及其功能: 1. **一般表达式** 使用路径方式选取所需元素。 ```python "/bookstore/book/title" ``` 这一表达式表示从根节点`<bookstore>`出发,找到所有的`<book>`标签下的`<title>`子节点[^2]。 2. **谓词表达式** 谓词允许进一步筛选符合条件的节点。 ```python "/bookstore/book[1]" ``` 表达式中的 `[1]` 是指第一个 `<book>` 元素;而 `/bookstore/book[last()]` 则会选中最后一个 `<book>` 元素[^2]。 3. **通配符表达式** 当不确定具体节点名称时,可以利用通配符 `*` 来匹配任意类型的节点。 ```python "/bookstore/*" "//title[@*]" ``` 上述两个例子分别代表了 bookstore 的所有直接子节点以及具有任何属性的 title 元素。 4. **轴表达式** 轴定义了一组相对当前上下文节点的关系方向。 ```python "child::book" "attribute::lang" "descendant-or-self::*" ``` 第一条命令返回的是 book 子节点集合;第二条则提取出名为 lang 的属性列表;第三种情况涵盖了本节点本身加上其全部后代节点。 5. **算术与逻辑操作** 支持基本数值计算及条件判断。 ```python "/bookstore/book[price>35.00]/title" ``` 此处仅选出价格超过 35 的书籍标题。 #### Python实现案例 下面展示如何借助第三方库lxml解析并查询HTML/XML文件内的信息: ```python from lxml import etree # 创建一个简单的 XML 文档对象模型 (DOM) root = etree.XML(""" <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="zh-CN">Harry Potter</title> <author>J.K. Rowling</author> <year>2007</year> <price>29.99</price> </book> </bookstore> """) # 查找所有书名 titles = root.xpath('//book/title/text()') print(titles) # 获取特定语言版本的图书数量 english_books_count = len(root.xpath("//book[./title/@lang='en']")) print(english_books_count) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值