php常用的有三种解析xml的方式,sax,dom,***,其中sax比较省内存,dom是直接把整个文档直接都读入内存,比较耗内存,当文档大于20M的时候,就会感觉的出来,***这种方式最简单,但相对来讲功能也简单些。这三种除了解析也都能方便地用来创建XML文档。下面介绍下DOM这种方式。
通过遍历对象的树型结构,我们可以不需要标记就显示出所有的内容。通过递归地遍历所有子节点,我们可以把这个例子中所有的内容显示出来。
PHP代码:
1 <? php
2 $dom = new DomDocument ();
3 $dom -> load ( 'test2.xml ' );
4 $root = $dom -> documentElement ;
5
6 process_children ( $root );
7
8 function process_children ( $node )
9 {
10 $children = $node -> childNodes ;
11
12 foreach ( $children as $elem ) {
13 if ( $elem -> nodeType == XML_TEXT_NODE ) {
14 if ( strlen ( trim ( $elem -> nodeValue ))) {
15 echo trim ( $elem -> nodeValue ). "/n" ;
16 }
17 } else if ( $elem -> nodeType == XML_ELEMENT_NODE ) {
18 process_children ( $elem );
19 }
20 }
21 }
22 ?>
输出如下:
引用:
XML Example
Moved to
example.org
.
foo & bar
这 个例子显示了一些非常简单的DOM处理。我们只是读取了元素的属性并且没有调用任何方法。在第4行中,我们从第3行加载的DOM文档中获取根元素。针对每 一个遇到的元素,我们调用process_children()(从第6行到第18行)来遍历子节点列表(第12行)。如果节点是一个文本节点,我们输出 它的值(13—16行),如果是一个元素,我们递归调用process_children(17—18行)。DOM扩展的功能比这个例子中显示出来的更加 强大。它几乎能够执行所有DOM2规范中描述的功能。
下面的例子中使用了DomElement类的getAttribute()方法来返回body标记的背景属性:
PHP代码:
1 <? php
2 $dom = new DomDocument ();
3 $dom -> load ( 'test2.xml ' );
4 $root = $dom -> documentElement ;
5
6 process_children ( $root );
7
8 function process_children ( $node )
9 {
10 $children = $node -> childNodes ;
11
12 foreach ( $children as $elem ) {
13 if ( $elem -> nodeType == XML_ELEMENT_NODE ) {
14 if ( $elem -> nodeName == 'body' ) {
15 echo $elem -> getAttributeNode ( 'background' ) ->value. "/n";
16 }
17 process_children ( $elem );
18 }
19 }
20 }
21 ?>
我们仍然需要递归地搜寻树型结构查找正确的元素,但是因为知道文档的结构,我们可以把例子简化为:
PHP代码:
1 <? php
2 $dom = new DomDocument ();
3 $dom -> load ( 'test2.xml ' );
4 $body = $dom -> documentElement -> getElementsByTagName ( 'body' ) ->item(0);
5 echo $body -> getAttributeNode ( 'background' )-> value . "/n" ;
6 ?>
第4行是主要的代码处理行。首先,我们请求DOM文档的documentElement,也就是这个DOM树型结构的根节点。 从那个元素开始,我们通过使用getElementsByTagName请求所有的标记名为body的子节点。然后,列出列表中第一个条目(因为我们知道 文件中第一个body标记就是正确的那一个)。在第5行中,我们通过getAttributeNode请求背景属性,并且通过读取value属性把它的值 显示出来。
使用XPath
通过使用XPath,我们可以进一步简化先前的例子。XPath是针对XML文档的一种查询语言,而且它也在XSLT中用来匹配节点。我们可以使用XPath来查询一个DOM文档中特定的节点和属性,就类似于使用SQL查询一个数据库:
PHP代码:
1 <? php
2 $dom = new DomDocument ();
3 $dom -> load ( 'test2.xml ' );
4 $xpath = new DomXPath ( $dom );
5 $nodes = $xpath -> query ( "*[local-name()='body']" , $dom ->documentElement);
6 echo $nodes -> item ( 0 )-> getAttributeNode ( 'background' )-> value .
"/n" ;
7 ?>
创建一个DOM树
DOM扩展除了解析XML还可以做更多的事情。它可以从一个文档框架 中 创建XML文档。在你的脚本中,你可以创建一个对象树,然后把它作为XML文件保存在硬盘。这种写XML文件的方法在脚本中不是很容易实现,但是无论如何 我们都会实现它。在这个例子中,将创建一个内容与刚才例子中我们使用的XML显示的数据类似的文件。我们不能保证这个文件会完全一样,因为DOM扩展可能 不会像人一样整洁地处理XML文件中的空白字符。让我们从创建DOM对象和根节点开始吧:
引用:
<? php
$dom = new DomDocument();
$html = $dom->createElement('html');
$html->setAttribute(" xml ns", " http://www.w3.org/1999/xhtml ");
$html->setAttribute(" xml :lang", "en");
$html->setAttribute("lang", "en");
$dom->appendChild($html);
首 先,我们使用new DomDocument()创建一个DomDocument类。所有的元素都是通过调用DomDocument 的createElement()方法创建的。元素的名字——这个例子中,为html——被传递到这个方法,并且返回一个DomElement类型的对 象。返回的对象用来增加属性到元素中。在DomElement创建后,我们通过调用appendChild()方法把它加到DomDocument中。然 后,我们增加head到html元素中并把一个title元素增加到head元素中:
引用:
$head = $dom->createElement('head');
$html->appendChild($head);
$title = $dom->createElement('title');
$title->appendChild($dom->createTextNode("XML Example"));
$head->appendChild($title);
跟 以前一样,我们首先通过调用DomDocument 对象的createElement()方法创建一个DomDocument对象(例如head),并且接下来通过appendChild()增加新创建的 对象到已经存在的DomElement对象(例如$html)中。然后,我们增加body元素的背景属性。接下来,我们增加'p'元素,它包含我们的X (HT)ML文档中主要的内容,而且是作为body元素的一个子节点:
PHP代码:
/* 创建body元素 */
$body = $dom -> createElement ( 'body' );
$body -> setAttribute ( "backgound" , "bg.png" );
$html -> appendChild ( $body );
/* 创建p元素 */
$p = $dom -> createElement ( 'p' );
$body -> appendChild ( $p );
<p>元素中的内容更加复杂些。它包含(按顺序)一个文本元素("Moved to ")、一个<a>元素、另一个文本元素(点字符)、<br>元素和第三个文本元素("foo & bar"):
PHP代码:
/* 增加"Moved to" */
$text = $dom -> createTextNode ( "Moved to " );
$p -> appendChild ( $text );
/* 增加a元素 */
$a = $dom -> createelement ( 'a' );
$a -> setAttribute ( "href" , "[url=http://example.org/]http://example.org/[/url]" );
$a -> appendChild ( $dom -> createTextNode ( "example.org" ));
$p -> append_child ( $a );
/* 增加"."、br和"foo & bar" */
$text = $dom -> createTextNode ( "." );
$p -> appendChild ( $text );
$br = $dom -> createElement ( 'br' );
$p -> appendChild ( $br );
$text = $dom -> createTextNode ( "foo & bar" );
$p -> appendChild ( $text );
在创建X ( HT ) ML文档的DOM结束后,我们就把它输出到屏幕上:
echo $dom -> saveXML ();
?>
输出与我们原来的文档类似,只是少了一些空白字符(这里为了方便阅读,加上了空白字符):复制PHP内容到剪贴板
PHP代码:
<?xml version = "1.0" ?>
<html xml ns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]" xml :lang="en" lang="en">
<head>
<title>XML Example</title>
</head>
<body background="bg.png">
<p>Moved to <a href="[url=http://example.org/]http://example.org/">example.org</a[/url]>.
➥<br>foo & bar</p>
</body>
</html>