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

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

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

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村中少年原创文章,未经允许不得转载,博主链接这里

相关推荐
码农幻想梦3 天前
实验四 XML
xml
dilvx5 天前
二进制安卓清单 binary AndroidManifest - XCTF apk 逆向-2
android·xml
菜鸟阿康学习编程10 天前
JavaWeb 学习笔记 XML 和 Json 篇 | 020
xml·java·前端
索然无味io10 天前
XML外部实体注入--漏洞利用
xml·前端·笔记·学习·web安全·网络安全·php
Ase5gqe11 天前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·大数据·架构
JavaEdge.13 天前
IDEA导入Maven工程不识别pom.xml
xml·maven·intellij-idea
前网易架构师-高司机13 天前
行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%
xml·yolo·行人检测数据集
梦幻加菲猫13 天前
加菲工具格式化XML:让数据呈现更清晰
xml·web·网页开发·xml格式化
我曾经是个程序员13 天前
C#操作Xml节点
xml·c#
violin-wang13 天前
XML映射文件
xml·java·前端·mybatis