移除子节点
使用removeChild方法从DOM树中移除子节点。
DOMNode DOMNode::removeChild(DOMNode $oldnode):这个函数移除一个子节点,$oldnode参数指出要移除的子节点。下面的示例代码从Book.xml文档中移除子 节点,从图5中显示的输出内容可以看到bibliography节点消失了。
图- 5 移除节点:移除最后一个子节点<bibliography>后,重新列出了节点的名称值,显示节点确实被移除了
替换节点
为了用一个新节点替换已有的节点,使用replaceChild方法。
DOMNode DOMNode::replaceChild(DOMNode $newnode, DOMNode $oldnode):这个函数使用$newnode子节点替换$oldnode节点。
例如,假设你想用新的code子节点替换ISBN子节点:
- //获取ISBN节点
- $element = $dom->getElementsByTagName('ISBN')->item(0);
- //创建新的<code>元素
- $code = $dom->createElement('code', '909090');
- //调用replacingNode函数
- replacingNode($code,$element);
- //这个函数使用$node替换$currentNode
- function replacingNode($currentNode, $node)
- {
- $node->parentNode->replaceChild($currentNode, $node);
- }
图6中显示的输出内容表明节点被替换了
图- 6 替换节点:这里显示的是用新的<code>节点替换<ISBN>节点后的文档内容
导入节点
使用importNode方法从另一个树拷贝一个节点到当前的树。
DOMNode DOMDocument::importNode(DOMNode $importedNode [,bool $deep]):这个方法从另一个XML文档导入一个节点,然后插入当前文档的DOM树中, $importedNode参数指出了要导入的节点,导入的节点表示原始节点的一份拷贝,因此导入操作不会修改外部树,$deep参数控制是否导入被导入节点的深度,值为 TRUE时,导入完整的节点子树,为FALSE时,只导入节点本身。
下面的示例从Book_continue.xml文件导入<continue>节点到Book.xml,下面是Book_continue.xml文档的内容:
- <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <!--chapter V-->
- <continue>
- <chapter_V>
- <title>XPath</title>
- <content>XPath is language for...</content>
- </chapter_V>
- <![CDATA[
- This chaper is a bonus to...
- ]]>
- <printing cap_I="click_here_for_chapter_I"
- cap_II="click_here_for_chapter_II"
- cap_III="click_here_for_chapter_III"
- cap_IV="click_here_for_chapter_IV"
- cap_V="click_here_for_chapter_V" />
- </continue>
- 下面是导入<continue>节点的代码:
- <?php
- $olddoc = new DOMDocument;
- $olddoc->load("Book_continue.xml");
- //我想导入到一个新文档的节点
- $node = $olddoc->getElementsByTagName("continue")->item(0);
- $newnewdoc = new DOMDocument;
- $newdoc->formatOutput = true;
- $newdoc->load("Book.xml");
- //导入节点及其所有子节点到文档
- $node = $newdoc->importNode($node, true);
- //然后追加到根节点
- $newdoc->documentElement->appendChild($node);
- echo "\nThe 'new document' after copying the nodes into it:\n";
- $root = $newdoc->firstChild;
- function getNodesInfo($node)
- {
- if ($node->hasChildNodes())
- {
- $subNodes = $node->childNodes;
- foreach ($subNodes as $subNode)
- {
- if (($subNode->nodeType != 3) ||
- (($subNode->nodeType ==3) &&
- (strlen(trim($subNode->wholeText))>=1)))
- {
- echo "Node name: ".$subNode->nodeName."\n";
- echo "Node value: ".$subNode->nodeValue."\n";
- }
- getNodesInfo($subNode);
- }
- }
- }
- getNodesInfo($root);
- ?>
图7显示前面代码的输出
图- 7 导入节点:这里显示了从Book_continue.xml导入节点并追加到Book.xml后的样子
检查节点的等同性
检查两个节点是否相同使用isSameNode方法。
bool DOMNode::isSameNode(DOMNode $node):当节点是相等的时候,这个函数返回一个布尔值TRUE,否则返回FALSE,$node参数表示你要和当前节点进行比较 的节点。
注意比较不是基于节点的内容进行的:
- //检查两个节点是否相同
- $author1 = $root->getElementsByTagName('autor')->item(0);
- $author2 = $root->getElementsByTagName('autor')->item(1);
- //调用verifyNodes函数
- verifyNodes($author1,$author2);
- function verifyNodes($currentNode, $node)
- {
- if (($currentNode->isSameNode($node))==true)
- {
- echo "These two nodes are the same";
- }
- }
创建新的树
PHP 5 DOM扩展可以让你从零开始构建DOM树,下面的示例创建了一个全新的XML文档,使用了两个新函数创建注释和CDATA节点。
1、DOMComment DOMDocument::createComment(string $data):创建一个新的注释节点,$data参数表示节点的内容。
2、DOMCDATASection DOMDocument::createCDATASection(string $data):创建一个新的CDATA节点,$data参数表示节点的内容。
- <?php
- //创建一个文档实例
- $document = new DOMDocument();
- //使用缩进格式化输出
- $document->formatOutput = true;
- //创建一个注释
- $comment = $document->createComment('Beautiful flowers!!!');
- $document->appendChild( $comment );
- //创建<flowers>根元素
- $root = $document->createElement( 'flowers' );
- $document->appendChild( $root );
- //创建<tulips>子节点
- $tulips = $document->createElement( 'tulips' );
- //创建<tulips>元素的第一个子节点<bulbs>,并设置其属性
- $bulbs_1 = $document->createElement( 'bulbs' );
- $bulbs_1->setAttribute('price','€ 7.65');
- $bulbs_1->appendChild($document->createTextNode( 'Parrot'));
- $tulips->appendChild( $bulbs_1 );
- //创建<tulips>元素的第二个子节点<bulbs>,并设置其属性
- $bulbs_2 = $document->createElement( 'bulbs' );
- $bulbs_2->setAttribute('color','magenta');
- $bulbs_2->appendChild($document->createTextNode( 'Lily flowering' ));
- $tulips->appendChild( $bulbs_2 );
- //追加<tulips>节点到根节点后
- $root->appendChild( $tulips );
- //创建CDATA小节
- $cdata = $document->createCDATASection(
- '<gladiolus><species>Sword Lily</species>'.
- '<species>Starface</species></gladiolus>');
- $document->appendChild( $cdata );
- //保存对象树到Flowers.xml
- echo $document->saveXML();
- $document->save('Flowers.xml');
- ?>
- 新的Flower.xml文档内容如下:
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <!--Beautiful flowers!!!-->
- <flowers>
- <tulips>
- <bulbs price="€ 7.65">Parrot</bulbs>
- <bulbs color="magenta">Lily flowering</bulbs>
- </tulips>
- </flowers>
- <![CDATA [<gladiolus>
- <species>Sword Lily</species>
- <species>Starface</species>
- </gladiolus>
- ]]>
清单2中的代码创建了一个对象树,并将其保存为Flowers.xml。
清单2 创建一个新的DOM树
本文简单介绍了PHP 5 DOM扩展,并介绍如何使用它操作XML或HTML)文档,以及如何从零创建一个DOM树。
- 国外优秀开源PHP建站程序一览
- PHP 5.3:远大于开发者预期的重大版本
- PHPnow1.5.3下载 - 绿色PHP环境包
- 浅谈如何搭建IIS+PHP+JSP+MySQL环境
- 开发老手谈Windows平台的PHP应用开发
PHP之友评论