Sử dụng XPath với PHP

Hãy để XPath làm những việc khó cho bạn khi làm việc với XML

Nếu các ứng dụng PHP của bạn còn làm những việc ngoài các hoạt động CRUD (Tạo, Đọc, Cập nhật và Xóa), có khả năng là bạn đã làm việc với XML. Thế nhưng, việc dẫn hướng trong một tài liệu hoặc luồng dữ liệu XML để tìm phần tử dữ liệu mong muốn có thể rất mất công và thậm chí làm nản lòng các nhà phát triển PHP. Việc này có thể đặc biệt mất thì giờ khi cấu trúc dữ liệu XML phức tạp. XPath là một tiêu chuẩn của W3C có mục đích duy nhất chỉ là — nhận được phần tử dữ liệu đúng, hoặc, cụ thể hơn, đúng nút mong muốn. PHP hỗ trợ XPath như là một phần của các lớp và các hàm XML của nó. Trong bài này, bạn khám phá một số kịch bản cơ bản để định vị thông tin trong XML và cách XPath có thể làm những việc khó khăn cho bạn trong các ứng dụng PHP của bạn.

Tracy Bost, Kỹ sư phần mềm, Freelance

Author photo - Tracy BostTracy Bost là một nhà phát triển phần mềm và kỹ sư các hệ thống dầy dạn. Chuyên ngành của ông là tích hợp ứng dụng mức doanh nghiệp. Trước đây ông giữ chức vụ là đồng chủ tịch của nhóm làm việc Các quy tắc nghiệp vụ của Tổ chức bảo trì tiêu chuẩn công nghiệp thế chấp (MISMO- Mortgage Industry Standards Maintenance Organization) và đồng chủ tịch ủy ban về các tiêu chuẩn công nghiệp cho RuleML2010. Ông đã làm việc trong nhiều ngành nghề, bao gồm thế chấp, bất động sản và khu vực phi lợi nhuận.



02 02 2012

Các từ viết tắt thông dụng

  • API: Giao diện lập trình ứng dụng
  • CRUD: Tạo, Đọc, Cập nhật và Xóa
  • CSS: Các bản định kiểu xếp chồng
  • DOM: Mô hình đối tượng tài liệu
  • JSON: Ký pháp đối tượng JavaScript
  • RDF: Khung công tác mô tả tài nguyên
  • REST: Chuyển giao trạng thái đại diện
  • RSS: Cung cấp thông tin cực kỳ đơn giản
  • SKU: Chỉ số hàng hóa tối thiểu trong kho
  • URI: Mã định danh tài nguyên thống nhất
  • W3C: Hiệp hội mạng Web toàn cầu
  • XHTML: Ngôn ngữ đánh dấu siêu văn bản mở rộng được
  • XPath: Ngôn ngữ đường dẫn XML
  • XSL: Ngôn ngữ bản định kiểu mở rộng
  • XSLT: Phép biến đổi Ngôn ngữ bản định kiểu mở rộng

Trong bài này, hãy tìm hiểu về các khái niệm sau:

  • Cách sử dụng Xpath.
  • Viết các biểu thức XPath cơ bản.
  • Sử dụng chức năng XPath của thư viện XML của PHP.
  • Sử dụng XPath và PHP để chuyển đổi các định dạng dữ liệu.

Bài này có một số ví dụ hoạt động bằng cách sử dụng XPath với PHP mà bạn có thể thực hành, với giả định rằng bạn đã có những kỹ năng tiên quyết được mô tả trong phần Các điều kiện cần có trước.

Các điều kiện cần có trước

Để học được nhiều nhất từ bài này, bạn cần có kiến thức về XML và PHP5 cùng với việc cấu hình và cài đặt các phần mở rộng PHP. Ngoài ra, bạn cần truy cập và cần có kiến thức làm việc với một hệ điều hành dựa trên-UNIX® hay Microsoft® Windows® với một máy chủ web hỗ trợ PHP5 mà trên đó bạn có thể thực hành các ví dụ mã được trình bày trong bài này.


Hiểu sự cần thiết của XPath

Khi web hướng nhiều hơn đến tầm nhìn ban đầu của web ngữ nghĩa, các ứng dụng trở nên tương tác nhiều hơn với nhau. Các công nghệ như SOAP, REST, RSS, RDF và các công nghệ khác là những hỗ trợ mạnh mẽ cho web tương lai. Với phần lớn trường hợp, XML là định dạng thông báo được chọn để mô tả dữ liệu liên quan. Bạn có thể sử dụng JSON đến một mức độ nào đó, nhưng bạn sẽ có thể nhận thấy XML là phương pháp chủ yếu để trao đổi dữ liệu.

Hoặc, bạn có thể gặp phải nhiệm vụ chuyển đổi dữ liệu XML sang XHTML để cung cấp một giao diện hấp dẫn, tương tác và dễ sử dụng cho những người dùng di động và các trình duyệt web khác nhau.

Việc lưu trữ dữ liệu là các tài liệu XML vào một hệ thống tệp hoặc một cơ sở dữ liệu phù hợp với XML cũng là một cách phổ biến để lưu trữ dữ liệu để sau này lấy ra cho các nhiệm vụ như tạo báo cáo, hiển thị giao diện người dùng, hoặc làm việc với tích hợp ứng dụng.

Khi làm việc với dữ liệu XML, bạn cần phân tích cú pháp dữ liệu để nhận được một mẫu thức chung nhỏ nhất — đó là dữ liệu mong muốn (hoặc giá trị nút nguyên tử, như người ta thường gọi nó). XSLT là một tiêu chuẩn W3C thực hiện chuyển đổi XML sang một định dạng khác như HTML, PDF, hoặc thậm chí tài liệu XML khác có sử dụng một lược đồ khác. Nó dựa rất nhiều vào việc sử dụng XPath, cũng giống như là XQuery, XForms và XPointer.


Nền tảng của XPath

Ở dạng đơn giản nhất của mình, XPath là một ngôn ngữ dùng để dẫn hướng trong một cây XML trong bộ nhớ. Ban đầu, XPath được thiết kế như là một ngôn ngữ cho XSLT và XPointer. XPath 1.0 đã trở thành một tiêu chuẩn W3C vào năm 1999. XPath 2.0 phổ biến hiện nay đã được công nhận là một đặc tả vào năm 2007.

Khi các đặc tả khác về XML mới nổi lên, việc sử dụng XPath cũng vậy. Hiện nay, XPath là ngôn ngữ được ưa chuộng để dẫn hướng XML trong các lược đồ XML, ISO Schematron, XQuery và XForms. Trớ trêu thay, nhưng với lý do chính đáng, XPath không được dựa trên cú pháp XML. Nó sử dụng cú pháp riêng của mình để tránh va chạm với các URI và cú pháp XML khác có liên quan.

Khi bạn làm việc với XPath trong PHP, chỉ cần nhớ rằng bạn không sử dụng XPath một mình. Bạn sử dụng nó như một công cụ để dẫn hướng XML trong bộ nhớ trong khi làm việc với một trong các đặc tả XML khác.

Với mục đích của bài này, tôi sử dụng đặc tả XPath 1.0 là bản được dùng rộng rãi nhất, trong các thảo luận và các ví dụ. XPath 2.0 tương thích lùi với XPath 1.0, nhưng hiện nay PHP mới hỗ trợ hạn chế cho XPath 2.0.

Đặc tả XPath cung cấp mô tả chi tiết về thuật ngữ và việc sử dụng tiêu chuẩn của nó. Nếu bạn lường trước việc sử dụng phức tạp của XPath với PHP, thì đặc tả này là một điểm tin cậy để tham khảo. Mặt khác, có thể tóm tắt đặc tả XPath thành bốn lĩnh vực quan tâm chính, như mô tả trong Bảng 1.

Bảng 1. Bốn lĩnh vực chính của đặc tả XPath
Lĩnh vựcMô tảCác ví dụ
Các đường dẫn vị tríGồm có các bước vị trí, các trục, các biến vị ngữ và cú pháp viết tắt.parent::node, child::text(), attribute::*, /PRODUCTS/PRODUCT[3]/NAME
Mô hình dữ liệuMô tả XML như là một cây. Có các nút gốc, các thuộc tính, văn bản, các vùng tên, các phần tử, các chỉ thị xử lý và các chú thích./, /ns1:PRODUCTS/ns1:PRODUCT, @category
Các biểu thứcCó thể chứa các tham chiếu biến, các hàm, các giá trị Bool, các số, các chuỗi ký tự và các biến vị ngữ./PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category
Các hàmXPath 1.0 có 27 hàm dựng sẵn được phân loại như là các hàm thiết lập nút, chuỗi ký tự, Boolean, hoặc các hàm số.string-length(), true(), sum()

Viết các biểu thức XPath

Trước khi viết mã PHP, hãy dành thời gian để xem xét các nút, các đường dẫn và các hàm XPath. Tệp products.xml trong Liệt kê 1 đưa ra các ví dụ của một số biểu thức thường được sử dụng để xác định vị trí dữ liệu trong một đường dẫn XML dựa trên các biến vị ngữ, xác định vị trí các giá trị nguyên tử của các nút và sử dụng các hàm.

Liệt kê 1. Một tài liệu XML mẫu của các sản phẩm (products.xml)
<?xml version="1.0" encoding="UTF-8"?>
<PRODUCTS>
  <PRODUCT category="software">
    <SKU>soft32323</SKU>
    <SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
    <NAME>Widget Reporting</NAME>
    <PRICE>4500</PRICE>
  </PRODUCT>

  <PRODUCT category="software">
    <SKU>soft32323</SKU>
    <SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
    <NAME>Pro Reporting</NAME>
    <PRICE>2300</PRICE>
  </PRODUCT>

  <PRODUCT category="storage">
    <SKU>soft32323</SKU>
    <SUB_CATEGORY>Tape Systems</SUB_CATEGORY>
    <NAME>Tapes Abound</NAME>
    <PRICE>2300</PRICE>
  </PRODUCT>

  <PRODUCT category="storage">
    <SKU>soft32323</SKU>
    <SUB_CATEGORY>Disk Systems</SUB_CATEGORY>
    <NAME>Widget100 Series</NAME>
    <PRICE>6500</PRICE>
  </PRODUCT>
</PRODUCTS>

/PRODUCTS trả về tất cả các nút là con của nút PRODUCTS, trong đó có bốn nút. Hãy chú ý đến biểu tượng dấu gạch chéo thuận (/). Nếu bạn đã quen thuộc với các hệ điều hành dựa trên UNIX, bạn biết rằng dấu gạch chéo thuận biểu diễn đường dẫn tuyệt đối. Như trong các đường dẫn tệp UNIX, bạn có thể sử dụng một đường dẫn tuyệt đối khi có nghi ngờ về vị trí ngữ cảnh hiện tại của bạn. Với tài liệu trong Liệt kê 1, PRODUCTS là nút gốc.

Đường dẫn tương đối cũng làm việc với XPath. Khi bạn sử dụng .. trong một biểu thức, nó chỉ thị cho biểu thức này tiến lên một mức từ nút hiện tại trong hệ thống phân cấp (cũng lại tương tự như làm việc với các thư mục trong các hệ điều hành UNIX). Ví dụ, ../PRODUCT/SKU trả về giá trị nút nguyên tử cho tất cả bốn số SKU gắn liền với mỗi nút PRODUCT.

Việc chọn một nút thuộc tính đòi hỏi cú pháp đặc biệt trong XPath. Nếu bạn muốn trả về tất cả các nút PRODUCT được liệt kê trong thể loại phần mềm, biểu thức /PRODUCTS/PRODUCT[@category='software'] làm đúng việc đó. Trong biểu thức này, category (thể loại) được coi là một thuộc tính trong tài liệu XML. XPath có thể chọn các thuộc tính bằng ký hiệu @. Một cách khác thay thế là bạn có thể chọn một thuộc tính bằng cách sử dụng cú pháp /PRODUCTS/PRODUCT[attribute::category='software']. Hầu hết mọi người cho rằng ký hiệu @ sẽ ngắn gọn và dễ sử dụng hơn.

Để chọn các giá trị nút nguyên tử (có nghĩa là, giá trị văn bản thực tế) của tất cả các tên sản phẩm cho các sản phẩm trị giá hơn $ 2.500, bạn có thể viết biểu thức là /PRODUCTS/PRODUCT[PRICE > 2500]/NAME. Khi được thi hành, biểu thức này trả về các tên sản phẩm là Widget ReportingWidget100 Series.

Hãy xem một ví dụ biểu thức cuối cùng trước khi chuyển sang sử dụng XPath với PHP: /PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category. Khi được thi hành, biểu thức này trả về hai giá trị: softwarestorage (lưu trữ). Cụ thể là, biểu thức này khớp với giá trị thể loại của mỗi sản phẩm có tên dài hơn 15 ký tự.

Tài liệu XML trong Liệt kê 1 là tài liệu nguồn cho các biểu thức XPath được thể hiện trong bài này.


Khám phá sự hỗ trợ XPath trong PHP

Việc PHP hỗ trợ XML và XPath không có gì bất ngờ. Thực vậy, các ngôn ngữ kịch bản lệnh web phổ biến nhất đều cung cấp một số hàm thích hợp để làm việc với XPath trong các thư viện lõi của nó.

Trong các thư viện lõi của PHP, bạn có một vài sự lựa chọn khi làm việc với XML:

  • SimpleXML.
  • DOM.
  • XMLWriter/Reader (Trình viết /Trình đọc XML).

SimpleXML dễ sử dụng và có thể thích hợp cho các công việc liên quan đến XML tương đối đơn giản. Nó có một số hạn chế; ví dụ, nó không hỗ trợ đầy đủ việc viết, xác nhận hợp lệ và các vùng tên. Nếu bạn đang xử lý một cây dữ liệu XML lớn, hãy nhớ rằng SimpleXML tải toàn bộ cây tài liệu XML này vào bộ nhớ trước khi xử lý.

Nếu bạn cần phải thực hiện các biểu thức XPath phức tạp hơn và cần kiểm soát toàn bộ tài liệu, thì DOM là một tùy chọn. DOM là viết tắt của Document Object Model (Mô hình đối tượng tài liệu), là một tiêu chuẩn W3C. Bạn có thể sử dụng DOM với PHP bằng cách cài đặt nó như là một phần mở rộng. Các phần mở rộng như là DOM thường không khó cài đặt và chạy. Nhiều khi để chạy mô đun đã được biên dịch, chỉ cần bỏ dấu chú thích ở đầu một dòng trong tệp php.ini của bạn. Cũng giống như SimpleXML, DOM tải toàn bộ cây tài liệu XML vào bộ nhớ trước khi xử lý. Như bạn sẽ thấy sau trong bài này, DOMXPath cũng hoàn toàn dễ sử dụng.

Bạn cũng có thể tải về và cài đặt XML_XPath từ kho lưu trữ của Kho lưu trữ Ứng dụng và Mở rộng của PHP (PEAR- PHP Extension and Application Repository). Lớp này sử dụng DOM và cung cấp một cách truy vấn bằng cách sử dụng XPath để thao tác tài liệu và trích xuất các giá trị nút nguyên tử.

Nếu bạn làm việc với Zend Framework (Khung công tác Zend), bạn đã có sẵn một thư viện Zend_Dom_Query để dùng. Nếu khung công tác PHP cụ thể của bạn không cung cấp các lớp hoặc các hàm đặc biệt cho XML và XPath, bạn chỉ cần sử dụng những thứ mà PHP đã cung cấp.

XMLWriter/Reader không trực tiếp hỗ trợ XPath nếu không có sự giúp đỡ từ SimpleXML hoặc DOMXPath, vì vậy trong bài này sẽ không trình bày nó thêm nữa.

Bất kể bạn sử dụng thư viện hoặc khung công tác nào, thì việc hiểu biết cách tạo ra các biểu thức XPath là điều cốt yếu để nhận được toàn bộ khả năng tiềm tàng. Khi sử dụng XPath với các thư viện liên quan đến XML của PHP, cú pháp XPath là như nhau. Các ví dụ và trình bày sau đây sử dụng sự kết hợp cả DOM và SimpleXML.


Làm việc với XPath trong PHP

Với tệp products.xml mẫu từ Liệt kê 1 và API của SimpleXML của PHP5, bạn có thể thử nghiệm với các biểu thức XPath khác nhau.

Khi bạn thực thi mã trong Liệt kê 2, kết quả là toàn bộ tệp XML hoàn chỉnh, tất nhiên là trong một mảng. Biểu thức XPath /PRODUCTS dẫn đến kết quả khớp với mọi nút là con của nút gốc (PRODUCTS).

Liệt kê 2. Sử dụng SimpleXML để hiển thị tất cả các nút trong một mảng
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [PRODUCT] => 
Array ( [0] => SimpleXMLElement Object
( [@attributes] => Array ( [category] => software ) 
[SKU] => soft1234 
[SUB_CATEGORY] => Business Analysis 
[NAME] => Widget Reporting 
[PRICE] => 4500 ) 
[1] => SimpleXMLElement Object 
( [@attributes] => Array ( [category] => software ) 
[SKU] => soft5678
[SUB_CATEGORY] => Business Analysis 
[NAME] => Pro Reporting 
[PRICE] => 2300 ) 
[2] => SimpleXMLElement Object
( [@attributes] => Array ( [category] => storage ) 
[SKU] => stor01010 
[SUB_CATEGORY] => Tape Systems 
[NAME] => Tapes Abound 
[PRICE] => 1900 ) 
[3] => SimpleXMLElement Object 
( [@attributes] => Array ( [category] => storage ) 
[SKU] => stor23232 
[SUB_CATEGORY] => Disk Systems 
[NAME] => 
Widget100 Series [PRICE] => 6500 ) ) ) )

Khi bạn thực thi mã trong Liệt kê 3, kết quả là một mảng đầu ra chứa giá trị của mỗi nút NAME của cây XML. Lưu ý rằng biểu thức /PRODUCTS/PRODUCT/NAME tìm mọi nút khớp với nó trong cây XML chứ không phải chỉ một nút đầu tiên hoặc nút cuối cùng.

Liệt kê 3. Sử dụng SimpleXML để hiển thị tất cả các tên sản phẩm trong một mảng
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Widget Reporting ) 
[1] => SimpleXMLElement Object ( [0] => Pro Reporting ) 
[2] => SimpleXMLElement Object ( [0] => Tapes Abound ) 
[3] => SimpleXMLElement Object ( [0] => Widget100 Series ) )

Nếu bạn cần giá trị của một hoặc một số nút cụ thể dựa trên một số tiêu chí, hãy làm theo các ví dụ trong các Liệt kê 45.

Xác định vị trí một giá trị nút nguyên tử là để trích xuất các giá trị mong muốn từ tài liệu XML. Khi bạn thực thi mã trong Liệt kê 4, kết quả là giá trị nguyên tử của một nút.

Liệt kê 4. Sử dụng SimpleXML để hiển thị tên của sản phẩm cho một SKU cụ thể
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Pro Reporting ) )

Biểu thức XPath /PRODUCTS/PRODUCT[SKU='soft5678']/NAME quy định rõ tất cả các nút khớp với biểu thức này. Trong trường hợp này, chỉ có một sản phẩm có số SKU phù hợp. Nếu bạn cần phải xác định vị trí một giá trị của nút, liên quan đến vị trí của nó trong cây XML, bạn có thể sử dụng hàm position().

Bạn có thể sử dụng các biểu thức điều kiện trong XPath để xác định rõ vị trí của các nút cụ thể. Liệt kê 5 cho thấy một ví dụ về điều này khi sử dụng SimpleXML và XPath với một biểu thức điều kiện.

Liệt kê 5. Sử dụng SimpleXML để xác định vị trí các sản phẩm dựa theo một điều kiện
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[@category='software' and PRICE > 2500]"); 
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [@attributes] => 
Array ( [category] => software ) 
    [SKU] => soft1234 
    [SUB_CATEGORY] => Business Analysis 
    [NAME] => Widget Reporting [
    PRICE] => 4500 ) )

Bạn có thể đã nhận thấy rằng các Liệt kê 2, 3, 45 có cùng một mã PHP giống hệt nhau — khác biệt duy nhất là các biểu thức XPath. Khi bạn nắm vững các bước sử dụng SimpleXML, bạn có toàn bộ sức mạnh của ngôn ngữ XPath sẵn sàng phục vụ bạn. Các bước cần thực hiện với mã PHP khi sử dụng SimpleXML được tóm tắt như sau:

  1. Tải tệp XML vào bộ nhớ.
  2. Viết và thực thi biểu thức XPath bằng cách sử dụng Object->xpath class.
  3. Thao tác các nút và giá trị đã so khớp bằng cách sử dụng các kỹ năng PHP của bạn.

Kết quả đầu ra trong mỗi liệt kê là câu lệnh print_r($products);. Nó kết xuất giá trị để hiển thị như một mảng. Trong thực tế, nhiều khả năng bạn sẽ lấy kết quả và thực hiện một số phép toán trên nó bằng cách sử dụng PHP.

Liệt kê 6 sử dụng DOM và DOMXPath để làm việc với XML và XPath.

Liệt kê 6. Sử dụng DOMXPath để hiển thị tên sản phẩm cho một SKU cụ thể
<?php

$doc = new DOMDocument;
$doc->load('products.xml');
$xpath = new DOMXPath($doc);
$products = $xpath->query("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
 
foreach ($products as $product)
{
   print($product->nodeValue);
}
 ?>
------------------------------------------------------------
OUTPUT:

Pro Reporting

Dãy mã PHP mà bạn sử dụng cho DOM và DOMXPath không phức tạp hơn so với các bước của. Các bước trong Liệt kê 6 được tóm tắt theo trình tự sau đây:

  1. Tải tệp XML vào bộ nhớ từ đối tượng DOM.
  2. Tạo một đối tượng XPath từ tài liệu đã tải.
  3. Truy vấn cây XML và trả về một đối tượng các sản phẩm.

Một lần nữa, khi bạn cảm thấy thoải mái với đoạn mã PHP sử dụng DOM, bạn có XPath sẵn sàng thực hiện công việc khó khăn nhàm chán.


Sử dụng XPath cho các chuyển đổi

Trong thực tế, bạn có thể chuyển đổi XML thành XHTML mà không cần sử dụng XSLT. Bạn có thể phát triển tiếp và trở nên sáng tạo hơn với các ví dụ trước đây khi chỉ sử dụng SimpleXML hoặc DOM và tạo các tệp XHTML của bạn để hiển thị. Và bạn cũng có thể thoải mái hơn với cách tiếp cận đó. Tuy nhiên, việc xem xét cách sử dụng XPath rộng lớn hơn là để cho các chuyển đổi XSLT và PHP có hỗ trợ XSLT, nên việc trình diễn là thích hợp. Ngoài ra, việc sử dụng XSLT có thể tiết kiệm cho bạn rất nhiều thời gian và đỡ thất vọng!

Các chuyển đổi XSLT của PHP

Để tập trung vào PHP và XPath, ví dụ chuyển đổi trong phần này không sử dụng bất kỳ các liên kết CSS hoặc URL hợp lệ nào. Khi chuyển đổi dữ liệu bằng cách sử dụng XSLT, hãy nhớ rằng bạn có thể bao gồm các kiểu dáng, JavaScript, hoặc bất cứ điều gì khác mà các trang HTML điển hình của bạn cần. Ngoài ra, tệp XSL của bạn nhiều khả năng sẽ được tổ chức cẩn thận trong cấu trúc ứng dụng của bạn theo cách phù hợp với khung công tác của bạn.

Một sự hiểu biết chắc chắn về XPath là cốt yếu khi tiến hành chuyển đổi dữ liệu XML sang các định dạng khác như HTML với XSLT.

Các nguồn cấp dữ liệu RSS và Atom đều được dựa trên XML cho nên XPath là công cụ lý tưởng để duyệt qua nguồn cấp và chọn dữ liệu mong muốn. Giả sử rằng bài này có nguồn cấp dữ liệu Atom riêng của mình dành cho các kỹ thuật PHP và XPath khác nhau, bạn có thể sử dụng một trong các thư viện XML của PHP để trích xuất các mục từ nguồn cấp dữ liệu và hiển thị chúng như mong muốn trên trang web của bạn.

Một tệp XSLT đơn giản giống như tệp trong Liệt kê 7.

Liệt kê 7. Một tệp XSLT đơn giản chuyển đổi một nguồn cấp dữ liệu sang HTML (article_feed.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
  <head><title><xsl:value-of select="	 //title"/></title></head>
  <table>
  <tr>
    <td><xsl:value-of select="//title"/></td>
  </tr>
  <tr>
    <td><i>"<xsl:value-of select="//subtitle"" />",</i></td>
  </tr>
  <tr>
    <td>by <xsl:value-of select="//author"" /></td>
  </tr>
  <xsl:for-each select="//feed/entry"">
  <table border="1" > 
  <tr>
    <td>Title</td>
    <td><xsl:value-of select="title""/></td>
  </tr>
  <tr>
    <td>Summary</td><td><xsl:value-of select="summary""/></td>
  </tr>
  <tr></tr>
  </table>
  <br/>
  </xsl:for-each>
  </table>
</html>
</xsl:template>
</xsl:stylesheet>

Hai dấu gạch chéo thuận (//) chỉ thị cho XPath so khớp với nút có tên đầu tiên bắt đầu từ nút gốc. Với mỗi nút duy nhất cho tiêu đề, phụ đề và tác giả, đây là một cách viết tắt để biểu thị đường dẫn vị trí mà không cần nhập đường dẫn tuyệt đối. Vì vòng lặp for-each làm việc trong ngữ cảnh của nút //feed/entry, nên các đường dẫn tương đối cho tiêu đề và bản tóm tắt được sử dụng.

Sử dụng tệp XSLT của Liệt kê 7, bây giờ bạn có thể viết mã PHP thích hợp để thực hiện chuyển đổi, như trong Liệt kê 8.

Liệt kê 8. Sử dụng DOM để chuyển đổi XLST
<?php
$doc = new DOMDocument();
$xmlStream = <<<MyFeed
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Using XPath with PHP</title>
  <author><name>Tracy Bost</name></author>
  <subtitle type="html">
      Let XPath do the hard work for you when working with XML</subtitle>
  <link rel="self" type="text/html"
      hreflang="en" href="http://www.ibm.com/developerworks/"/>
  <updated>15 Aug 2011 22:51:48 +0000</updated>
  <entry> 
    <title>SimpleXML & XPath </title> 
    <summary>If you are using SimpleXML to parse XML or
         RSS feeds, XPath is great to use!</summary> 
    <link rel="self" type="text/html" hreflang="en" href=""/> 
    <published>21 Apr 2011 04:00:00 +0000</published> 
    <updated>21 Apr 2011 04:00:00 +0000</updated> 
  </entry> 
  <entry> 
    <title>DOMXPath</title> 
    <summary>If you are using DOM for traversal XML documents, 
        give DOMXPath a try! </summary> 
    <link rel="self" type="text/html" hreflang="en" href=""/> 
    <id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
    <published>12 Aug 2011 04:00:00 +0000</published> 
    <updated>12 Aug 2011 04:00:00 +0000</updated> 
  </entry> 
  <entry> 
    <title>XMLReader with XPath</title> 
    <summary>For complex XML document reading and writing, 
        using XPath with XReader can ease your burden!</summary> 
    <link rel="self" type="text/html" hreflang="en" href=""/> 
    <id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
    <published>08 Aug 2011 04:00:00 +0000</published> 
    <updated>08 Aug 2011 04:00:00 +0000</updated> 
  </entry> 
</feed> 
MyFeed;

   $doc->loadXML($xmlStream); $xpath = new DOMXpath($doc); 
    $xslt = new XSLTProcessor(); $xsl = new DOMDocument(); 
    $xsl->load( 'xsl/article_feed.xsl', LIBXML_NOCDATA); 
    $xslt->importStylesheet( $XSL ); 
    print $xslt->transformToXML( $XML );
?>

------------------------------------------------------------
OUTPUT: 

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Using XPath with PHP</title>
</head>

<body>
  <table>
    <tr>
        <td>Using XPath with PHP</td>
    </tr>
    <tr>
        <td><i>"Let XPath do the hard work for you when working with XML",</i></td>
    </tr>
    <tr>
        <td>by Tracy Bost</td>
    </tr>
    <table border="1">
        <tr>
            <td>Title</td>
            <td>SimpleXML & XPath </td>
        </tr>
        <tr>
            <td>Summary</td>
            <td>If you are using SimpleXML to parse XML or RSS feeds,
                     XPath is great to use!</td>
        </tr>
        <tr/><
    /table>
    <br/>
    <table border="1">
        <tr>
            <td>Title</td>
            <td>DOMXPath</td>
        </tr>
        <tr>
            <td>Summary</td>
            <td>If you are using DOM for traversal XML documents, 
                      give DOMXPath a try! </td>
        </tr>
        <tr/>
    </table>
    <br/>
    <table border="1">
        <tr>
            <td>Title</td>
            <td>XMLReader with XPath</td>
        </tr>
        <tr>
            <td>Summary</td>
            <td>For complex XML document reading and writing, 
                 using XPath with XReader can ease your burden!</td>
        </tr>
        <tr/>
    </table>
    <br/>
  </table>
</body>
</html>

Lưu ý rằng Liệt kê 8 đã không có câu lệnh $xpath->query() như thể hiện trong Liệt kê 6. Tất cả các biểu thức XPath được đặt trong tệp XSL. Chỉ cần sử dụng DOM để nhập khẩu bản định kiểu, rồi để cho nó thực hiện chuyển đổi!


Tóm tắt

Trong bài này, bạn đã được giới thiệu về XPath và cách bạn có thể sử dụng nó trong môi trường PHP5 khi bạn làm việc với XML. Giống như rất nhiều các thư viện khác có sẵn trong PHP, các thư viện XML cho phép bạn là một nhà phát triển để tập trung vào các yêu cầu nhiệm vụ của bạn chứ không phải việc nối buộc mức thấp các lớp và các đối tượng. XPath có thể giúp loại bỏ những nhiệm vụ nặng nề về định vị và phân tích cú pháp dữ liệu trong XML. Tùy thuộc vào các nhu cầu của bạn, bạn có thể tùy chọn sử dụng SimpleXML, DOM, hoặc các thư viện XML của một khung công tác, ví dụ như Zend Framework. May mắn thay, tất cả chúng đều làm việc với XPath của W3C theo một kiểu tiêu chuẩn. Vì vậy, khi bạn tải tệp hoặc luồng dữ liệu XML tiếp theo đó, không có lo ngại nào về việc dẫn hướng đến các giá trị chính xác mà bạn cần xử lý.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Khi bạn đăng ký với trang developerWorks lần đầu tiên, một tiểu sử của của bạn được tạo ra. Chọn các thông tin về tiểu sử của bạn (tên, nước/vùng, và nơi làm việc) đã được hiện lên màn hình, thông tin này sẽ được hiện kèm với nội dung mà bạn đăng tải. Bạn có thể cập nhật thông tin này bất kỳ lúc nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=790953
ArticleTitle=Sử dụng XPath với PHP
publish-date=02022012