在PHP程序载入XML文件是使用DOMDocument对象的方法。首先建立DOMDocument对象,如下所示:
$dom = new DOMDocument();
//下文出现的$dom都表示一个DOMDcument树状结构对象。
在设定剖析器的相关参数后,就可以载入XML文件,如下所示:
$dom->preserveWhiteSpace = false;
if ( $dom->load(“book.xml”) )
{
如果载入成功则需要执行的代码写在这里;
}
9.1.3 DOMDocuement对象属性
DOMDocuement对象提供相关属性设定剖析器参数,如下表所示:
preserveWhiteSpace,设定是否保留元素内容是空白的字元的节点,默认值是true,表示删除。false为删除。
resolveExternals,设定是否截住外部实体节点,默认值是true,表示载入。false为不载入。
validateOnParse,载入XML就使用DTD进行验证,默认值是false,表示不验证。true表示验证。
如果将validateOnparse的属性值设置为true,则表示要对载入的XML文件进行验证,XML文件格式验证分为DTD和XML Schema两种验证方式。示例如下:
在PHP程序中验证XML文件是引用validate()和schemaValidate()方法,如下所示:
$dom->validate();
$dom->schemaValidate(“book.xsd”);
上述validate()方法是DTD验证,schemaValidate()方法是XML Schema验证,参数是XML Schema文件路径和名称,验证成功传回true,错误传回false。
9.1.4 DOMDocument文件对象
XML文件树状结构是DOMDocument对象,当DOM载入XML文件建立$dom对象后,就可以使用属性取得XML文件的根节点,如下所示:
$root = $dom->documentElement;
documentElement属性是XML文件的根节点。DOMDocument对象提供方法可以直接使用标签名称取得指定节点和其子节点,如下所示:
$nodes=$dom->getElementsByTagName(“book”);
上述指令取得所有<book>标签的子节点,取出的节点集合是DOMNodeList对象。
9.1.5 DOMNode节点对象
DOMDocument对象是由DOMNode节点对象所组成,在DOMNode对象中提供相关属性和方法可以取得XML元素的名称和内容,如下所示:
$root = $dom->documentElement;
echo “<b>根元素:</b>” . $root->nodeName . “<br>”;
nodeName属性可以取得节点名称。DOMNode对象提供childNodes属性取得这些子节点的DOMNodeList对象,如下所示:
$nodes=$root->childNodes;
9.1.6 DOMNode节点对象属性
DOMNode节点对象的相关属性说明,如下表所示:
childNodes,取得子节点的DOMNodeList节点清单对象,也就是子节点树。
attributes,如果是DOMElement节点对象,可以取得所有属性的DOMNamedNodeMap对象。
nodeName,节点名称,依不同节点的种类而不同。
nodeType,节点种类的代码。
nodeValue,节点的值。
textContent,取得子节点的内容,也就是XML元素的内容和其子节点。
例如:取得根节点的节点名称和值,如下所示:
echo $root->nodeName;
echo iconv(“utf-8″,”big5”,$root->nodeValue);
程序码取得根节点的名称和值,属性值需要使用iconv()函数,将utf-8的编码转换成big5编码。
因为DOMNode节点对象还能拥有其他子节点,所以DOMNode节点对象提供hasChildNodes()方法检查节点是否拥有子节点,如下所示:
if ( $node->hasChildNodes() )
{ ……….. }
nodeType节点属性值是前述的XML常数,不同节点种类影响相关的属性值,常见的节点种类如下表所示:
应用示例:
<?php
$dom = new DomDocument();
//创建 DOM对象
if(!$dom->load(“example.xml”) )//读取 XML文件
{
echo”XML文件读取失败”;
exit();
}
$root = $dom->documentElement;
//获取 XML数据的根
read_child($root);
//调用 read_child函数读取根对象
function read_child($node)
{
$children = $node->childNodes;
//获得$node的所有子节点
foreach($children as $e) //循环读取每一个子节点
{
if($e->nodeType == XML_TEXT_NODE)//如果子节点为文本型则输出
{
echo $e->nodeValue. “<BR>”;
//获取的是一对标记符中的文本内容,如<a>hello</a>中的hello
}
else if($e->nodeType == XML_ELEMENT_NODE)//如果子节点为节点对象,则调用函数处理
{
read_child($e);
}
}
}
?>
9.1.7 DOMElement元素对象
DOMElement对象代表树状结构的XML元素节点,这也是一种DOMNode对象,如果元素拥有内容,文字内容是DOMText节点,DOMElement对象的属性tagName可以取得标签名称,如下所示:
$eles = $dom->getElementsByTagName(“book”);
foreach ( $eles as $ele )
{
echo $ele->tagName .”<br>”;
}
程序码在取得book所有DOMElement元素对象后,使用foreach循环和tagName属性取得标签名称。
9.1.8 DOMElement元素属性
如果DOMElement元素拥有属性,我们可以呼叫hasAttributes()方法检查是否有属性,getAttribute()方法取得XML元素的属性值,如下所示:
if ( $eles->hasAttributes() ) //如果此节点有属性,则取此节点指定属性的值
{
echo “sales属性值: “.$eles->getAttribute(“sales”).”->”;
}
if条件判断是否有属性,如果有,就可以取得元素指定的sales属性值。
9.1.9 DOMText内容节点对象
DOMText对象指的是XML元素的文字内容。
9.1.10 DOMNamedNodeMap属性清单对象
XML元素可能拥有多个属性,PHP程序可以使用DOMElement对象的attributes属性取得所有属性的DOMNamedNodeMap对象,如下所示:
$atts = $node->attributes;
foreach ( $atts as $att )
{
$v=iconv(“utf-8″,”big5”,$att->nodeValue);
echo “(“. $att->NodeName .”/”. $v .”)<br>”;
}
上述程序码在使用attributes属性取得属性清单后,使用foreach循环取得所有属性名称和值。