第二十四回、PHP基础教程,载入与验证XML

在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基础教程,载入与验证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循环取得所有属性名称和值。