( ! ) Warning: include(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in D:\www\up\php\php_xml_dom.php on line 18
Call Stack
#TimeMemoryFunctionLocation
10.0000368224{main}( )...\php_xml_dom.php:0

( ! ) Warning: include(http://pub.houheaven.com/Nav02/Nav_deep2.htm): failed to open stream: no suitable wrapper could be found in D:\www\up\php\php_xml_dom.php on line 18
Call Stack
#TimeMemoryFunctionLocation
10.0000368224{main}( )...\php_xml_dom.php:0

( ! ) Warning: include(): Failed opening 'http://pub.houheaven.com/Nav02/Nav_deep2.htm' for inclusion (include_path='.;C:\php\pear') in D:\www\up\php\php_xml_dom.php on line 18
Call Stack
#TimeMemoryFunctionLocation
10.0000368224{main}( )...\php_xml_dom.php:0

XML 是一个很实用的东西,存储数据、交换数据都很方便,但如何对 XML 进行基本的操作呢?

对 XML 的操作包括创建 XML 文档,添加、查看、修改、删除数据,操作方法有很多种,可以使用 DOMDocument 类、SimpleXML 等都可以实现,本文介绍的是通过 DOMDocument 类进行操作。


DOMDocument 类

属性类型说明
documentElementDOMElementXML 文档的根节点,允许直接访问文档各个子元素节点
documentURIstringXML 文档的真实物理路径
encodingstringXML 文档的编码方式
formatOutputbool格式化输出,友好地保留缩进和空格
preserveWhiteSpacebool文档保存时保留多余的空格输出
validateOnParsebool解析 XML 文档时是否验证文档格式
方法返回值类型说明
load(xmlfile)int打开一个 xml 文档
save(xmlfile)int保存一个 xml 文档
loadHTMLFILE(htmlfile)int打开一个 html 文档
saveHTMLFILE(htmlfile)int保存一个 html 文档
getElementById(id)DOMNodeList获取拥有指定 ID 的元素节点
getElementsByTagName(tag)DOMNodeList获取指定标签名称的元素节点
createElement(TagName[,Value])DOMElement创建一个元素节点
getAttribute(AttrName)DOMAttr获取一个元素节点的属性
createAttribute(AttrName)DOMAttr创建一个元素节点的属性
setAttribute(AttrName,AttrValue)DOMAttr设置元素节点的属性和值
createTextNode(Value)DOMText创建一个文本内容
appendChild(DOMNode)DOMNode添加一个元素节点
removeChild(DOMNode)DOMNode移除一个元素节点
replaceChild(DOMNode)DOMNode替换一个元素节点
hasAttributes()bool判断一个元素节点是否有属性
hasChildNodes()bool判断一个元素节点是否有子节点

注意:以上的属性和方法只是此类的一部分,比较常用和实用,点此 查看全部


创建XML文档

说明:创建XML文档之前必须对XML有所了解,本文不做赘述,请参考相关知识。


PHP:create.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    
    $XML->formatOutput=true;			// 格式化输出,保留缩进
    $XML->preservaWhiteSpace=false;		// 不保留空格,这个是辅助格式化输出的
    
    $root=$XML->createElement("Languages");		// 创建根节点,有且只能有一个
    
    $lang1=$XML->createElement("Lang","Chinese");	// 创建一个子节点,这是方法一
    $lang1->setAttribute("id","1001");			// 设置子节点的属性
    
    $lang2=$XML->createElement("Lang");			// 创建一个子节点,这是方法二
    $lang2_text=$XML->createTextNode("English");	// 创建子节点的内容
    $lang2_Attr_n=$XML->createAttribute("id");		// 创建子节点的属性名称
    $lang2_Attr_v=$XML->createTextNode("1002");		// 创建子节点的属性内容
    $lang2_Attr_n->appendChild($lang2_Attr_v);		// 将属性内容赋值给属性名称
    $lang2->appendChild($lang2_text);			// 为创建的空子节点添加内容
    $lang2->appendChild($lang2_Attr_n);			// 为创建的空子节点添加属性

    $root->appendChild($lang1);				// 添加子节点,不添加将不能显示 $lang1
    $root->appendChild($lang2);				// 添加子节点,不添加将不能显示 $lang2
    
    $XML->appendChild($root);				// 最重要的一步:将根节点添加到文档里面
    
    $XML->save("language.xml");				// 保存 XML 文档,路径是相对路径
    

XML:language.xml

<?xml version="1.0" encoding="utf-8"?>

<Languages>

<Lang id="1001">Chinese</Lang>

<Lang id="1002">English</Lang>

</Languages>


提示:如果不格式化输出,XML 将会显示如下。

<?xml version="1.0" encoding="utf-8"?>

<Languages><Lang id="1001">Chinese</Lang><Lang id="1002">English</Lang></Languages>


读取XML数据

说明:读取 XML 数据是通过获取 XML 中的节点然后再读取里面的内容的方式来实现的,获取节点有两种方法:getElementById() 和 getElementsByTagName()。


①. getElementById()


XML:book.xml打开

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE books [

<!ELEMENT books (book)+>

<!ELEMENT book (#PCDATA)>

<!ATTLIST book index ID #REQUIRED>

]>

<books>

<book index="b001">《红楼梦》</book>

<book index="b002">《西游记》</book>

<book index="b003">《水浒传》</book>

<book index="b004">《三国演义》</book>

</books>

PHP:read.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    $XML->validateOnParse=true;			// 开启验证,DTD 验证文档格式
    $XML->load("language.xml");			// 打开一个 XML 文件
    $langs=$XML->getElementById("b002");	// 获取 id 为 "b002" 的节点
    echo $langs->nodeValue;			// 输出 《西游记》
    

注意!!!!!!这个函数比较特殊,需要注意以下几点:

第一:请仔细看 book.xml,这个文档是含有 DTD(文档类型定义),第 2-5 行,不然函数无法识别 ID。

第二:再次观看 book.xml,元素属性值必须以字母开头,否则此函数会闹情绪出现小错误。

第三:要想使用此函数必须开启 XML 验证,即将参数 validateOnParse 设置为 true 。


②. getElementsByTagName()


XML:language.xml打开

<?xml version="1.0" encoding="utf-8"?>

<Languages>

<Lang id="1001">Chinese</Lang>

<Lang id="1002">English</Lang>

</Languages>

PHP:read.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    $XML->load("language.xml");			// 打开一个 XML 文件
    
    $langs=$XML->getElementsByTagName("Lang");	// 通过标签名获取指定的节点集合
    $lang=$langs->item(1);			// 通过 item() 获取指定节点
    echo $lang->nodeValue;			// 显示节点的文本内容,English
    

修改XML数据

说明:修改 XML 数据是通过获取 XML 中的节点然后再对节点赋值的方式来实现的。


XML:media.xml打开

<?xml version="1.0" encoding="utf-8"?>

<Languages>

<Lang id="1001">Chinese</Lang>

<Lang id="1002">English</Lang>

</Languages>

PHP:edit.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    $XML->load("language.xml");			// 打开一个 XML 文件
    
    $langs=$XML->getElementsByTagName("Lang");	// 通过标签名获取指定的节点集合
    $lang=$langs->item(1);			// 通过 item() 获取指定节点
    $lang->nodeValue="Japanese";		// 为节点赋值,Japanese
    
    $XML->save("language.xml");			// 亲,记得保存
    

删除XML数据

说明:删除 XML 数据是通过获取 XML 中的节点集合然后再移除子节点的方式来实现的。

注意:在执行删除操作之前,一定得弄清楚一点,只有父节点才能删除子节点,其他的都无法删除。


①. 删除单行嵌套的数据


XML:language.xml打开

<?xml version="1.0" encoding="utf-8"?>

<Languages>

<Lang id="1001">Chinese</Lang>

<Lang id="1002">English</Lang>

</Languages>

PHP:delete.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    $XML->load("language.xml");			// 打开一个 XML 文件
    $root=$XML->documentElement;		// 获取根节点
    $parent=$XML->getElementsByTagName("Languages")->item(0);	// 获取指定的节点集合的父元素
    $langs=$XML->getElementsByTagName("Lang");			// 获取指定的节点集合
    $lang=$langs->item(1);					// 通过 item() 获取指定节点
    
    // 下面的三行代码用于测试,测试三次,每次只使用其中一行,通过对比来验证结论!
    
    $XML->removeChild($lang);			// 错误,$XML 不是父节点(删除此行程序会正常)
    $root->removeChild($lang);			// 正确,$root 恰巧是父节点,因为嵌套只有一层
    $parent->removeChild($lang);		// 正确,$parent 是真正的父节点
    
    $XML->save("language.xml");			// 亲,记得保存
    

②. 删除多行嵌套的数据


XML:media.xml打开

<?xml version="1.0" encoding="utf-8"?>

<media>

<intro>此文档存放的是音乐和电影。</intro>

<music>

<song id="101">

<name>Dangerous</name>

<singer>迈克·杰克逊</singer>

</song>

<song id="102">

<name>红玫瑰</name>

<singer>陈奕迅</singer>

</song>

</music>

<movies>

<movie id="201">

<name>告白</name>

<area>日本</area>

</movie>

<movie id="202">

<name>无间道</name>

<area>中国</area>

</movie>

</movies>

</media>

PHP:delete.php

    
    $XML=new DOMDocument("1.0","utf-8");	// 实例化一个对象,并设置 XML 版本和编码
    $XML->load("media.xml");			// 打开一个 XML 文件
    $root=$XML->documentElement;		// 获取根节点
    $parent=$XML->getElementsByTagName("music")->item(0);	// 获取指定的节点集合的父元素
    $songs=$XML->getElementsByTagName("song");			// 获取指定的节点集合
	
    foreach($songs as $song)				// 遍历要操作的整个节点集合
    {
        if($song->getAttribute("id")=="102")		// 删除 id 为102的节点
        {   // 调试四次,每次只使用其中一行!
            $XML->removeChild($song);			// 错误,$XML 不是父节点
            $root->removeChild($song);			// 错误,$root 不是父节点
            $songs->removeChild($song);			// 错误,$songs 不是父节点
            $parent->removeChild($song);		// 正确,$parent 是真正的父节点
        }
    }
    
    $XML->save("media.xml");			// 亲,全部讲完了,记得好评呢~
    

显示框架
显示框架
显示框架
显示框架