dom解析xml

php常用的有三种解析xml的方式,sax,dom,***,其中sax比较省内存,dom是直接把整个文档直接都读入内存,比较耗内存,当文档大于20M的时候,就会感觉的出来,***这种方式最简单,但相对来讲功能也简单些。这三种除了解析也都能方便地用来创建XML文档。下面介绍下DOM这种方式。

 

通过遍历对象的树型结构,我们可以不需要标记就显示出所有的内容。通过递归地遍历所有子节点,我们可以把这个例子中所有的内容显示出来。

复制PHP内容到剪贴板
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内容到剪贴板
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内容到剪贴板
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内容到剪贴板
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内容到剪贴板
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内容到剪贴板
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]>.
&#10149;<br>foo &amp; bar</p>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值