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:
如果<person id="s101">这种有属性的,也要遍历出来呢?
<?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>';
}
?>
源码面前,了无秘密