Giới thiệu XPath và ví dụ (trích xuất thông tin XML)

Giới thiệu XPath và ví dụ Như các bạn đã biết XML là một ngôn ngữ tuyệt vời để mô tả và lưu trữ dữ liệu. Tuy nhiên với tốc độ phát triển của công nghệ thông tin, nhu cầu của các ứng dụng không chỉ dừng lại ở mức lưu trữ, các hệ thống cần trao đổi thông tin với nhau. Để trao đổi thông tin trong các tài liệu XML, người ta cần một chuẩn chung để truy xuất dữ liệu. Giải quyết vấn đề đó, XML Path Language (XPath) được sinh ra. XPath là một ngôn ngữ thiết kế ra với mục đích giúp cho ứng dụng có thể di chuyển bên trong XML document và truy xuất các giá trị cũng như thuộc tính của các elements. Để có thể tiếp cận được Xpath nhanh nhất, trước tiên bạn cần hiểu về những ngôn ngữ đặc tả giống như XML, HTML. Cấu trúc 1 tài liệu XML có thể hình dung như 1 cái cây với nhiều cành và nhánh nhỏ khác nhau. Tất cả các thành phần đó đuề được gọi là element. Giờ ta sẽ xem mối quan hệ giữa các element này trong Xpath như thế nào:

Mục đích:

Chủ đề của bài này giới thiệu XPath, một thành phần hỗ trợ giúp truy xuất thông tin trong tập tin XML làm tiền đề cho việc áp dụng stylesheet kết hợp XML để tạo ra kết xuất tùy theo yêu cầu. Bên cạnh đó XPath cũng làm nền tảng cho việc hỗ trợ truy vấn parsing dữ liệu của tài liệu XML cực kỳ nhanh chóng hiệu quả. Hơn thế nữa, XPath hỗ trợ nền tảng để tạo ra XQuery áp dụng trong truy vấn dữ liệu tương tự như truy vấn SQL trên cơ sở dữ liệu

Xpath là ?

Xpath được định nghĩa như một XML path. Nó là cú pháp hay ngôn ngữ để tìm kiếm bất kỳ element nào trên trang web sử dụng XML path expression.

Ngoài ra, Xpath còn định nghĩa một số node đặc biệt để thể hiện mối quan hệ giữa các node trong mô hình trong quá trình xử lý như sau

  • Parent Node: node trên trực tiếp của node hiện hành
  • Child Node: tập node trực tiếp của node hiện hành cấp thấp hơn
  • Sibling: node ngang hàng hay cùng cha với node hiện hành
  • Ancestors: tất cả node con bên trên node hiện hành cùng nhánh
  • Descendants: tất cả node con bên dưới của node hiện hành cùng nhánh
Biểu thứcĐịnh nghĩa
tênNodeChọn tất cả các node con của tênNode
/Chọn tất cả các node tính từ root
//Chọn tất cả node tính từ node hiện hành
.Chọn node hiện hành
..Chọn node cha của node hiện hành
  • CÁC PHÉP TOÁN ĐƯỢC SỬ DỤNG TRONG XPATH
    • Đại số: +, -, * (nhân), div (chia thập phân), mod (chia lấy dư)
    • So Sánh hay quan hệ: =, != (khác), <, <=, >, >=
    • Luận lý: true, false, and, or, not
    • Kết hợp: | (hội)
  • CÁC THÀNH PHẦN HỖ TRỢ TRUY VẤN MỐI QUAN HỆ GIỮA CÁC NODE TRONG TÀI LIỆU XML (AXES)
    • Cú phápTênAxis::tênNode
AxisĐịnh nghĩa
ancestorChọn tất cả các node trên của node hiện hành
ancestor-or-selfChọn tất cả các node trên của node hiện hành và chính nó
attributeChọn tất cả các thuộc tính của node hiện hành
childChọn node con của node hiện hành
descendantChọn tất cả các node dưới của node hiện hành
descendant-or-selfChọn tất cả các node dưới của node hiện hành và chính nó
followingChọn tất cả các node sau khi tag đóng của node hiện hành
following-siblingChọn tất cả các node ngang cấp sau khi tag đóng của node hiện hành
namespaceChọn tất cả namespace của node hiện hành
parentChọn tất cả node cha của node hiện hành
precedingChọn tất cả các thành phần trước khi bắt đầu tag mở của node hiện hành
preceding-siblingChọn tất cả các node ngang hàng trước khi bắt đầu tag mở của node hiện hành
selfChọn node hiện hành
  • CÁC FUNCTIONS TRONG XPATH
HàmĐịnh nghĩa
node-name(node)Trả về tên node của node được đưa vào hàm
nilled(node)Trả về true nếu node là null
data(item, item, …)Lấy các trị tuần tự của các items đưa vào
base-uri()Lấy trị thuộc tính base-uri của node hiện hành
base-uri(node)Lấy trị của thuộc tính  base-uri của node
document-uri()Lấy trị của thuộc tính document-uri của tài liệu XML
number(arg)Trả về kiểu số
abs(num)Lấy trị tuyệt đối
ceiling(num)Lấy trị số nguyên nhỏ nhất lớn hơn num
floor(num)Lấy trị số nguyên lớn nhất nhỏ hơn num
string(arg)Trả về kiểu chuỗi
compare(comp1, comp2)So sánh giá trị cho comp1 với comp2, -1 là nhỏ hơn, 0 là bằng nhau và 1 là lớn hơn
concat(string, string, …)Nối chuỗi
substring(string, start [,len])Lấy chuỗi con trong string đưa vào
string-length([string])Lấy chiều dài của string node hiện hành hay từ string
normalize-space([string])Loại bỏ ký tự khoảng trắng thừa trong và ngoài chuỗi string của node hiện hành hay string
normalize-unicodeTương tự như normalize-space nhưng dùng cho Unicode
translate(string1, string2, string3)Convert chuỗi string1 bằng cách thay thế chuỗi string3 thay thế chuỗi string 2
contains(string1, string2)Trả ra true nếu string1 chứa string2
match(string1, pattern)Trả ra true nếu string1 tuân thủ đúng pattern
replace(string1, pattern, replace)Thay thế chuỗi replace với thành phần trong string1 đúng pattern
tokenize(string, pattern)Tương tự hàm split của ngôn ngữ java
boolean(arg)Convert giá trị arg trở về kiểu luận lý true hay false
count([node])Trả về số lượng node của node
last()Trả về node cuối cùng trong node hiện hành
local-name([node])Trả về tên node nằm sau phần dấu :
name()Trả về namespace qualified prefix:tênNode
namespace-uri([node])Trả về uri của namespace của node hiện hành hay node
text()Trả về chuỗi trị của node
position()Trả về vị trí của node

Giới thiệu XPath và ví dụ Các loại Xpath

Có 2 loại Xpath: Xpath tuyệt đối và Xpath tương đối.

1. Xpath tuyệt đối

  • Xpath tuyệt đối bắt đầu bằng dấu gạch chéo đơn “/”, cho phép xác định một đường dẫn tuyệt đối đến đối tượng UI
  • Ví dụ: html/body/div[1]/div[2]/form/div/div[3]/div[1]/div/div[2]/div[1]/div[1]/div/div/input 

Xpath tuyệt đối được xem là là cách tìm kiếm phần tử dễ dàng nhất, tuy nhiên nhược điểm của nó là nếu có bất kỳ thay đổi nào trên đường dẫn của element thì Xpath lấy sẽ sai.

2. Xpath tương đối

  • Xpath tương đói bắt đầu bằng 2 dấu gạch chéo “//”, cho phép xác định một đối tượng UI ở bất kỳ đâu trên trang web, không cần bắt đầu bởi thẻ html trong đường dẫn.
  • Ví dụ: //div//input: cho phép lấy ra toàn bộ thẻ input mà trước đó là một thẻ div.

Một số cách xác định phần tử bằng Xpath

1 Xác định bằng thuộc tính “@”

Thuộc tính “@” cho phép lọc các đối tượng thông qua một thuộc tính của nó bên trong thẻ html.

Ví dụ: "//div//input[@id='123']" cho phép lấy ra tất cả các thẻ input dưới thẻ div mà có thuộc tính id là 123

"//div[@class='abcd']" cho phép lấy ra tất cả các thẻ div mà có thuộc tính class là abcd.

"//a[@href='https://luulam.dev/']"lấy ra các thẻ a mà có chứa đường dẫn https://luulam.dev

2 Xác định bằng thuộc tính text()

  • text() cho phép lọc các đối tượng UI được trả về dựa trên nội dung text bên trong một thẻ html.
  • Ví dụ: "//div//p[@text()='luulam']" cho phép lấy tất cả các thẻ p trong mã nguồn có text là framgia.

3 Xác định bằng cách sử dụng toán tử OR và AND

Toán tử OR và AND dùng 2 điều kiện để cho kết quả tìm quả. Với OR tìm element khi một trong hai điều kiện là đúng, còn AND tìm element với 2 điều kiện đều đúng.

Ví dụ:

"//*[@type='submit' OR @name='btnReset']": cho phép lấy ra tất cả các thẻ mà có thuộc tính type là submit hoặc có thuộc tính name là btnReset.

"//input[@type='submit' AND @name='btnLogin']": cho phép lấy ra tất cả các thẻ input mà có type là submit và name là btnLogin.

4 Xác định thông qua preceding và following

Preceding và Following cho phép lọc các đối tượng UI từ một đối tượng xác định trước đó

Ví dụ:

“//div[@id=’123]/following::p”cho phép lấy ra tất cả các thẻ p trong mã nguồn bên dưới một thẻ div có id là ‘123’.

“//div[@name=’abc’]/preceding::input” cho phép lấy ra tất cả các thẻ input trong mã nguồn bên trên là một thẻ div có name là ‘abc’.

Các cách tìm kiếm và định vị các phần tử UI trong selenium với Giới thiệu XPath và ví dụ ở trên sẽ giúp việc tìm kiếm được chính xác và hiệu quả hơn, lựa chọn cách tìm kiếm phù hợp với từng tình huống.

Hoặc có thể tham khảo mội ví dụ củ thể với Xpath tại đây

Thấy hay và hũu ích hãy share với mọi người cùng đọc nhé ! Xem thêm tại : luulam.dev