数据格式之-XML数据查询语句xpath介绍

server/2024/12/27 12:19:22/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

很多数据格式都有自己的查询语言,例如数据库的sql语句针对的是数据库格式的增删改查,elastic 的eql针对的是基于elastic产品的格式数据增删改查。那么XML作为一种表示数据的格式,针对XML格式的数据如何进行查询呢?

针对XML数据格式的查询使用是xpath语法查询语句。本文将介绍一xpath的查询语法规则,并在之后借助工具进行演示和实现,让你在实际工作和学习过程中能够高效快速的处理XML格式的数据。

xpath__3">xpath 简介

实时上针对XML格式数据的查询早在1999年就已经被W3C提出,详见这里,叫做XPath1.0,XML格式的查询语法后续又经过了XPath2.0,XPath3.0的演进,增强和完善了查询语句的功能,但是目前以XPath1.0的的语法实现最为广泛。

Xpath 的查询语句在多种语言中均有实现,包括Python的libxml2,lxml。JavaScript的jquery-xpath,C++的libxml2等等。

查询语法

由于W3C关于xpath的规定读起来并不容易,本文将依据wiki的解释,介绍一下xpath 的查询语句的基本语法,详见这里。主要目的是方便读者在不同编程语言和工具中灵活的使用该种格式的查询语句灵活的查询XML数据的不同字段内容,实用性为主。

示例

本文将使用如下的示例进行说明:

xml"><?xml version="1.0" encoding="utf-8"?>
<blog><columns><column name="Cyberchef 从入门到精通教程" launch="2024-07-10"><articles><article name="Cyberchef配合Wireshark提取并解析SMB流量数据包中的文件">https://xiaofan.blog.csdn.net/article/details/143751864</article><article name="Cyberchef实用功能之-批量提取json数据文件的字段内容">https://xiaofan.blog.csdn.net/article/details/144485563</article><article name="Cyberchef技巧之-如何猜测数据的编码方式">https://xiaofan.blog.csdn.net/article/details/140190289</article></articles></column><column name="Wireshark从入门到精通" launch="2018-05-10"><articles><article name="Wireshark lua插件实现私有协议的解析">https://xiaofan.blog.csdn.net/article/details/105081441</article><article name="wireshark图形操作对应的命令行操作">https://xiaofan.blog.csdn.net/article/details/115362682</article><article name="Wireshark中实用的设置和使用技巧汇总">https://xiaofan.blog.csdn.net/article/details/103622111</article><article name="访问一个网站会经历哪些流程">https://xiaofan.blog.csdn.net/article/details/80991929</article></articles></column></columns>
</blog>

针对上述示例,简单说明如下:

  • XML数据的第一行往往用来表示XML数据格式版本,以及数据编码方式的。
  • XML的数据结构是一种被称之为XML tree的树状结构,详见这里。可以看到子节点之间的层级结构是非常明显的。
  • XML的root节点是一个表示整个XML数据的抽象概念,代表的是所有的XML数据。可以看到blog是root的一个子节点,columns是blog的子节点,以此类推。
  • 一个columns节点下有多个子节点,即名称各不相同的column节点,一个column节点下有多个article子节点。
  • 父节点的实际内容就是子节点,最底层节点的实际内容有最终的值。

有了上述的概念,因此如果想要查询XML对象中的article内容,大致的查询方式应该是blog/cloumns/column/articles。XML数据的查询语句,语法主要包含三个部分内容,即操作符,运算符和功能函数,下面具体介绍下具体的查询语法。

操作符

操作符即节点和属性字段的表示方式,如下:
在这里插入图片描述
对上述说明如下:

  • XPath包含两套语法格式,即简洁的查询语法格式以及更为详细的查询语法格式,通常使用的为简洁的查询语法格式。
  • XPath采用的是Unix文件路径风格的表达式,因此节点之间采用/字符进行分割,因此查询column节点的查询语句为blog/columns/column
  • // 符号表示XML数据中的任意节点的操作符,例如查询示例中的articles节点的查询语句为//articles
  • 点字符和两个点的字符分别表示当前节点以及父节点的操作符,但是这两个字符往往只能用在谓词表达式之中。
  • @ 字符是针对属性的操作符,例如如果查询专栏name对应的查询语句为//column/@name
  • 还有一个中括号,用来表示条件运算操作符,用来过滤对应的XML数据,条件运算符在XML语法中的官方叫法叫做谓词。

上述的这几个操作符应该是使用过程中最为高频的操作符。

运算符

运算符包含逻辑运算符,算术运算符以及比较运算符,如下:
在这里插入图片描述
例如针对上述示例,选择专栏这一层级中,创建日期为具体某一天查询语句为//column[@launch = "2024-07-10"],可以看到该查询语句中使用到了//,@,[],=等四种操作符和运算符。

功能函数

为了丰富查询语句的功能,Xpath还提供了如下的功能函数有限,如下:
在这里插入图片描述
例如针对上述示例,选择文章名称之中包含json字符串的的查询语句为//*[contains(@name, 'json')]或者//node()[contains(@name, 'json')],//*表示所有节点,contains为字符串搜索函数,@name表示name字段属性,json为需要在name字段中搜索的字符串,node()和 * 表示查找任意节点。
如果搜索文章的URL字段之中包含某个特定连接的查询语句为//*[contains(text(), '103622111')],103622111为需要在article的值中搜索的字符串,text()函数用来查找任何节点类型为文本的内容。

查询语句运用

有了上述的XML查询语法的说明,在实际的工作和学习过程中如何灵活运用上述查询语句呢,我将在我的专栏《Cyberchef 从入门到精通教程》,这里,之后的文章进行演示demo,详见《Cyberchef实用功能之-批量提取XML数据文件的字段内容》,这里。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。


http://www.ppmy.cn/server/153256.html

相关文章

List反转的方法

1.list循环 List<String> strsnew ArrayList<>();for (int i 0; i <100 ; i) {strs.add("a"i);}List<String> fzstrsnew ArrayList<>();for (int i strs.size()-1; i >0 ; i--) {fzstrs.add(strs.get(i));}System.out.println(fzstr…

前端取Content-Disposition中的filename字段与解码(vue)

前言 这个需求其实是根据导出文件来的&#xff0c;导出文件后&#xff0c;后端将文件名存储到请求头中的headers里了&#xff0c;那么前端需要从headers里的Content-Disposition里面取到并解码。 第一步&#xff1a;新增getFileRequest.js 因为涉及到拿去接口中的headers中数…

IBatis与MyBatis的区别

iBatis 和 MyBatis 都是优秀的持久层框架&#xff0c;它们都提供了对象关系映射&#xff08;ORM&#xff09;的功能&#xff0c;允许开发者将 Java 对象映射到数据库表。MyBatis 是 iBatis 的后继者&#xff0c;由同一个团队开发。以下是 iBatis 与 MyBatis 之间的一些主要区别…

常见网络攻击场景常被用于测试系统安全性

常见网络攻击场景常被用于测试系统安全性 在区块链系统中,以下网络攻击场景常被用于测试系统安全性: 51% 攻击 攻击原理:当一个或一组攻击者控制了超过全网 50%的算力时,就有可能操纵区块链的账本记录。在工作量证明(PoW)机制下,攻击者可以通过算力优势,实现对新区块的…

学会python+unittest框架打造高效自动化测试

前言 在软件开发领域&#xff0c;测试是确保软件质量、稳定性和用户满意度的重要环节。随着软件项目的日益复杂&#xff0c;传统的手动测试方法已难以满足快速迭代和持续交付的需求。因此&#xff0c;自动化测试框架成为了现代软件开发不可或缺的工具。本文将为您详细介绍Pyth…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…

ELK系列-(六)Redis也能作为消息队列?(下)

一、前文回顾 &#x1f50d; 在前面的ELK系列中&#xff0c;我们已经搭建了ELK的核心组件&#xff0c;包括&#xff1a; ELK系列-&#xff08;一&#xff09;Docker部署ELK核心组件ELK系列-&#xff08;二&#xff09;LogStash数据处理的瑞士军刀ELK系列-&#xff08;三&…

【提审】Android包提审报权限问题

问题&#xff1a;华为应用市场审核不通过 平台审核检测详情&#xff1a; 日志&#xff1a; 自检工具&#xff1a;frida-server【Unity&Android】安卓app自测应用隐私相关获取和申请权限_apk 隐私合规 自测-CSDN博客 参考资料&#xff1a;Unity启动时获取了android_id等设…