1.PHP DOM (1)

Php中的DOM跟javascript不一樣,屬性不用另外增加一個節點
2.主要類
DOMDocument :文檔類
DOMNodeList :節點列表類
DOMNode :節點類
DOMElement :元素類
3. DOMDocument類
3.1創建文檔對象
DOMDocument::__construct ([ string $version [, string $encoding ]] )
[ string $version :版本號
[, string $encoding ]]:字符集
3.2、加載xml文件
mixed DOMDocument::load ( string $filename)
string $filename:要加載的xml文件名稱
3.3、獲取節點
DOMNodeList DOMDocument::getElementsByTagName ( string name )
String name:要獲取的節點名
示例:Demo.php
<?php
header ( 'Content-Type:text/html;charset=gb2312' );
// 利用php解析demo01.xml
// 實例化dom對象
$dom = new DOMDocument ();
// 加載xml文件
$dom->load ( 'demo01.xml' );
// 通過dom對象獲取person節點,注意:這裡返回值是一個DOMNodeList類對象
$persons = $dom->getElementsByTagName ( 'person' );
// 共有幾個person
echo '共有' . $persons->length . '個人<br>'; //輸出共有兩個人
// 選中索引為0的person,也就是第一個人
$person = $persons->item ( 0 );
// 在這個person下獲取name節點,返回的仍然是一個DOMNodeList類對象
$names = $person->getElementsByTagName ( 'name' );
// 輸出姓名
echo $names->item ( 0 )->nodeValue . '<br>'; //輸出'張三'
為什麼要進行兩次取的Nodelist呢?請參照上圖,因為有兩個節點
demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="s101">
<name>zhangsan</name>
<age>30</age>
</person>
<person>
<name>wangwu</name>
<age>18</age>
</person>
</persons>
4. DOMNodeList類 (上面的person就是NodeList節點)
1、Length
當前節點列表中共有幾個節點
2、DOMElement DOMNodelist::item ( int $index )
選中索引為index的節點
int $index:索引
5、 DOMNode類
1、nodeValue 節點的值
6、 關於屬性的讀取
1、bool DOMElement::hasAttribute ( string $name )
判斷是否具有某個屬性(只判斷某個屬性下有沒有)
String $name:屬性名
2、bool DOMNode::hasAttributes ( void )
判斷是否具有屬性(只要有屬性就返回true)
3、string DOMElement::getAttribute ( string $name )
獲取指定屬性的屬性值
String $name:屬性名
示例2.用連貫操作輸出
<?php
$dom = new DOMDocument ( '1.0', 'utf-8' );
$dom->load ( 'demo01.xml' );
// 想得到第一個人的姓名
echo $dom->getElementsByTagName ( 'person' )->item ( 0 )
->getElementsByTagName ( 'name' )->item ( 0 )->nodeValue;
輸出:張三
Example3:
<?php
header ( 'Content-Type:text/html;charset=gb2312' );
$dom = new DOMDocument ( '1.0', 'utf-8' );
$dom->load ( 'demo01.xml' );
$person = $dom->getElementsByTagName ( 'person' )->item ( 0 );
// 判斷節點是否具有id屬性
if ($person->hasAttribute ( 'id' )) {
echo '具有id屬性';
} else {
echo '沒有id屬性';
}
echo '<br>';
// 判斷節點是否具有屬性
if ($person->hasAttributes ()) {
echo '有屬性';
} else {
echo '沒有任何屬性';
}
echo '<br>';
// 得到第一個person的id屬性值
echo $person->getAttribute ( 'id' );
之前的例子只能得到一條數據,現在我想得到所有人的完整信息,該如何實現?
示例4:
<?php
header ( 'content-type:text/html;charset=gb2312' );
$dom = new DOMDocument ( '1.0', 'utf-8' );
$dom->load ( 'demo01.xml' );
// 得到所有person節點
$persons = $dom->getElementsByTagName ( 'person' );
// 得到總人數
$count = $persons->length;
for($i = 0; $i < $count; $i ++) {
// $person表示第i個人
$person = $persons->item ( $i );
echo '第' . ($i + 1) . '個人的';
if ($person->hasAttribute ( 'id' )) {
echo '學號:' . $person->getAttribute ( 'id' );
}
echo '姓名:' . $person->getElementsByTagName ( 'name' )->item ( 0 )->nodeValue;
echo '年齡:' . $person->getElementsByTagName ( 'age' )->item ( 0 )->nodeValue;
echo '<br>';
}
?>