XPath XML

Приклад XML-файлу:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/bind9.xsl"?>
<statistics version="3.11">
  	<server>
    	<boot-time>2020-03-03T11:56:35.895Z</boot-time>
    	<config-time>2020-03-03T11:56:36.007Z</config-time>
    	<current-time>2020-03-03T12:37:36.479Z</current-time>
    	<version>9.14.11</version>
    	<counters type="opcode">
      		<counter name="QUERY">26305</counter>
      		<counter name="IQUERY">0</counter>
      		...
    	</counters>
    	<counters type="rcode">
      		<counter name="NOERROR">14899</counter>
      		<counter name="FORMERR">0</counter>
      		...
      	</counters>
   	</server>
</statistics>

В CentOS 8 для обробки зручно використовувати xmllint.

Приклади базового використання xpath:

$ xmllint --xpath 'counters' bind.xml // Обрати всі елементи counters, не залежно від того де вони розміщуються
<counters type="opcode">
    ...
</counters>
<counters type="rcode">
	...
</counters>
$ xmllint --xpath '/statistics' bind.xml // Обрати всі елементи statistics, які є кореневими
<statistics version="3.11">
	...
</statistics>
$ xmllint --xpath 'statistics/counters' bind.xml // Обрати всі елементи counters, які обов'язково є дитиною statistics
XPath set is empty
$ xmllint --xpath '//counters' bind.xml // Обрати всі елементи counters, не залежно від того де вони знаходяться
<counters type="opcode">
    ...
</counters>
<counters type="rcode">
	...
</counters>
$ xmllint --xpath 'statistics//counters' bind.xml // Обрати всі елементи counters, які належать дл statistics, але знаходяться в ньому будь-де
<counters type="opcode">
    ...
</counters>
<counters type="rcode">
	...
</counters>
$ xmllint --xpath '//counters/..' bind.xml
<view>
	<counters type="opcode">
		...
	</counters>
</view>
$ xmllint --xpath '//@type' bind.xml // Selects all attributes that are named lang, no matter where they are
type="opcode" type="rcode" type="qtype" type="nsstat" type="zonestat" type="resstat" type="resqtype"

Регулярні вирази

nodenameОбрати всі елементи з іменем “nodename”
/Обрати елементи з кореневого розділу
//Обрати елементи, які розміщуються у вказаному попередньо елементі, але знаходяться в ньому будь-де
.Обрати поточний елемент
..Обрати батьківський елемент для поточного елементу
@Обрати атрибути

Предикати

Предикати використовуються для пошуку конкретного вузла або вузла, який містить конкретне значення. Присудки завжди вбудовані у квадратні дужки. У таблиці нижче ми перерахували деякі вирази шляху з предикатами та результат виразів:

/statistics/server/counters[1] - обрати перший елемент counters
/statistics/server/counters[last()] - обрати останній елемент counters
/statistics/server/counters[last()-1] - обрати передостанній елемент counters
/statistics/server/counters[position()<3] - обрати перші 2 елементи counters
//counters[@type] - обрати елементи counters які мають атрибут будь-який type
//counters[@type="opcode"] - обрати елементи counters які мають атрибут type="opcode"
/statistics/server/counters[counter>20000] - обрати елементи counters які мають елемент counter, значення якого більше 20000
/statistics/server/counters[counter>20000]/counter - обрати елементи counter, батьківський елемент counter мають елемент counter, значення якого більше 20000

Невідомі елементи

/statistics/* - обрати всі дочірні елементи для statistics
//counter[@*] - обрати всі елементи counter, які мають будь-який атрибут

Поєднання директорій

/statistics/server/counters[1] | /statistics/server/counters[2] - обарти перший або другий елементи counters

Доступні оператори в виразах XPath: |, +, -, *, div, =, !=, <, <=, >, >=, or, and, mod

Функції XPath:

count() - повертає кількість вузлів в наборі
number() - конвертує аргумент в числовий тип
string() - конвертує аргумент в рядок

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *