Bài 19: Xử lý XML

PHP5 cung cấp class SimpleXML là một class rất dễ sử dụng, bài này sẽ hướng dẫn các ta parse file XML trong 7 nốt nhạc.

Đầu tiên, lấy một đoạn XML mẫu để tập tành phân tích:
HTML Code:
<?xml version="1.0"?>
<books>
  <book isbn="978-1594489501">
    <title>A Thousand Splendid Suns</title>
    <author>Khaled Hosseini</author>
    <publisher>Riverhead Hardcover</publisher>
    <amazon_price>14.27</amazon_price>
  </book>
  <book isbn="978-1594489587">
    <title>The Brief Wondrous Life of Oscar Wao</title>
    <author>Junot Diaz</author>
    <publisher>Riverhead Hardcover</publisher>
    <amazon_price>14.97</amazon_price>
  </book>
  <book isbn="978-0545010221">
    <title>Harry Potter and the Deathly Hallows</title>
    <author>J. K. Rowling</author>
    <publisher>Arthur A. Levine Books</publisher>
    <amazon_price>19.24</amazon_price>
  </book>
</books>
Để tạo ra một đối tượng SimpleXmlElement, cách đơn giản là truyền vào một chuỗi hoặc một file:
HTML Code:
// Passing the XML
$books = SimpleXMLElement($XmlData);
//-------------------
// Passing a filename
$books = SimpleXMLElement('books.xml', null, true);
Nhìn vào đoạn XML ví dụ, ta sẽ lấy ra mọi các book hay của Amazon:
PHP Code:
<?php
// load SimpleXML
$books = new SimpleXMLElement('books.xml', null, true);

echo <<<EOF
<table>
    <tr>
        <th>Title</th>
        <th>Author</th>
        <th>Publisher</th>
        <th>Price at Amazon.com</th>
        <th>ISBN</th>
    </tr>

EOF;
foreach($books as $book) // loop through our books
{
    echo <<<EOF
    <tr>
        <td>$book->title</td>
        <td>$book->author</td>
        <td>$book->publisher</td>
        <td>$$book->amazon_price</td>
        <td>$book['isbn']</td>
    </tr>

EOF;
}
echo '</table>';
?>
Bạn để ý rằng $books (có chữ 's' nhé) là một Element do khái niệm mỗi
một file XML thì phải có root element. Vì thế, đừng mong đợi có đối
tượng SimpleXml không nhé .
Mỗi element không phải là không có  đủ thứ element con cùng loại hay khác loại, ví dụ
này là cùng loại 'book' và class SimpleXmlElement này cho phép ta duyệt
qua các element con cùng loại như một array như  mẫu foreach()  ở trên.

Cuối cùng, nói về cú pháp truy cập child element và attribute. Bác nào chưa biết khái niệm này nữa thì:
HTML Code:
<book isbn="978-1594489501">
    <title>A Thousand Splendid Suns</title>
    <author>Khaled Hosseini</author>
    <publisher>Riverhead Hardcover</publisher>
    <amazon_price>14.27</amazon_price>
  </book>
isbn là một attribute, các giá trị của một attribute phải để trong dấu (")
<title>, <author>,... là các child element

Chỉ giải thích tới đây thôi, bác nào có ý định ngâm cứu XML, XML Schema,... thì 5s gợi ý là nên ... từ bỏ ý định ngông cuống thừa công sức này đi vì có cả năm may ra học mới xong mà học từ tháng 1-12 thì tới tháng 12 sẽ quên tháng 1 . Cứ việc coi nó như khái niểm HTML đã học rồi xài cho thoải mái nhá.

Quay về cú pháp, lại coi ví dụ 'simple' trên: $book->title là truy cập child element trong khi $book['isbn'] là truy cập attribute. Done!!!

Đơn giản thế thôi,  chúng ta thấy xử lý XML data có dễ chưa ?

 mẫu trên, nếu chúng ta không thích dụng foreach thì  không phải là không dùng biến counter $i, viết lại là $tempBook = $books->book[$i] rồi dùng $tempBook để xử lý.

Giờ thêm vào tí XPath cho nó bằng anh bằng em:

XPath đơn giản là cách chỉ ra đường dẫn "path" trong 1 XML document thông qua các element cha/con theo cú pháp giống như thư mục của linux: /home/user/... Xpath giúp ta lọc ra các child element trong các element cha cùng loại, gom lại thành mảng và xử lý.

Ví dụ sau giúp ta lấy ra mọi các title của book và  mọi các số ISBN:


PHP Code:
                              $titles = $books->xpath('book/title');
foreach($titles as $title)
{
    echo $title.PHP_EOL;
}
//////////////////////////////////////////////
$isbn = $books->xpath('book/@isbn');
foreach($isbn as $isbn)
{
    echo $isbn.PHP_EOL;
}
Nhớ chú ý cách dùng cú pháp / và /@ nhé.

Giờ parse thử RSS của tuổi trẻ coi sao nè


PHP Code:
<?php
$rss = new SimpleXMLElement('http://www.tuoitre.com.vn/tianyon/RssView.aspx?ChannelID=16', null, true);

echo "<h1><a href='$rss->channel->link'>$rss->channel->title</a></h1>".PHP_EOL.'<hr />'.PHP_EOL;

foreach($rss->xpath('channel/item') as $item)
{
    echo <<<EOF
<h2><a href='$item->link'>$item->title</a></h2>
<div>Posted at: $item->pubDate</div>
$item->description
<hr />

EOF;
}
?>
Cuối cùng,một vài thuộc tính của đối tượng SimpleXmlElement các bạn sẽ quan tâm:
PHP Code:
$value      = trim((string) $element);  // Bản thên element nó là XML,  chúng ta lấy giá trị của element thì ép kiểu về string
    $attributes = $element->attributes();   // lấy hầu hết các attribute
    $children   = $element->children();     // lấy các child element
Share on Google Plus

About Unknown

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 nhận xét:

Đăng nhận xét