- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Tuy nhiên, simpleXML không thực sự tốt khi nội dung XML có nhiều Namespace Elements. Ví dụ trường hợp bạn muốn đọc RSS feed, trong feed có các thành phần XML Namespace.
Xem ví dụ sau:
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> .... <item> <title>My Title</title> <description>My Item</description> <dc:publisher>ABC</dc:publisher> <dc:creator>DEF</dc:creator> <dc:date>2009-02-12T16:53:25Z</dc:date> </item> ... </channel> </rss>
Nạp nội dung XML từ file hoặc chuỗi có sẵn.
$feed = file_get_contents("http://linkto.my.feed"); $xml = new SimpleXmlElement($feed);
Sử dụng hàm simplexml_load_string
thay cho class SimpleXmlElement. Hàm này trả về instance đối tượng SimpleXmlElement
.
$feed = file_get_contents("http://linkto.my.feed"); $xml = simplexml_load_string($feed);
Hoặc có thể thay bằng simplexml_load_file
$xml = simplexml_load_file('http://linkto.my.feed');
Nếu có biến chứa nội dung chuỗi XML.
$string = <<<XML <?xml version='1.0'?> <document> <title>Forty What?</title> <from>Joe</from> <to>Jane</to> <body> I know that's the answer -- but what's the question? </body> </document> XML; $xml = simplexml_load_string($string); //hoặc $xml=new SimpleXmlElement($string);
Đọc các thẻ không khai báo namespace.
foreach ($xml->channel->item as $entry){ echo $entry->title; echo $entry->description; }
Nhưng nếu bạn muốn truy cập thẻ có namespace, ví dụ dc:publisher
hoặc dc:creator
Áp dụng đoạn code đơn giản giống cách làm với element bình thường chắc sẽ không hoạt động.
//This doesn't work ... foreach ($xml->channel->item as $entry){ echo $entry->publisher; echo $entry->creator; ... }
Code trên không bao giờ hoạt động, bởi vì thẻ publisher và creator thuộc các namespace khác nhau. Hãy nhìn trên khai báo namespace tại thẻ root.
.... xmlns:dc="http://purl.org/dc/elements/1.1/">
Chúng ta hiểu rằng các elements có namespace sẽ được quản lý vào mỗi nhóm namespace của nó, thông qua địa chỉ namespace. trường hợp trong ví dụ trên là “http://purl.org/dc/elements/1.1”:
$feed = file_get_contents("http://linkto.my.feed"); $xml = new SimpleXmlElement($feed); foreach ($xml->channel->item as $entry){ echo $entry->title; echo $entry->description; //Use that namespace $dc = $entry->children(‘http://purl.org/dc/elements/1.1/’); echo $dc->publisher; echo $dc->creator; }
Truyền địa chỉ namespace trực tiếp hoặc xác định bởi tên trong mảng trả về của hàm getNameSpaces
chứa toàn bộ thông tin namespace có trong XML.
... foreach ($xml->channel->item as $entry){ ... //Use that namespace $namespaces = $entry->getNameSpaces(true); //Now we don't have the URL hard-coded $dc = $entry->children($namespaces['dc']); echo $dc->publisher; echo $dc->creator; }
Mình có bài viết này trong điều kiện sửa lại attachment lỗi trong wordpress. Cảm ơn đã bạn đã sử dụng dịch vụ thiết kế website bên hoangweb.com.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype