PHP:XML操作
XML 是一个很实用的东西,存储数据、交换数据都很方便,但如何对 XML 进行基本的操作呢?
对 XML 的操作包括创建 XML 文档,添加、查看、修改、删除数据,操作方法有很多种,可以使用 DOMDocument 类、other、other 等都可以实现,本文介绍的是通过 DOMDocument 类进行操作。
DOMDocument 类
属性 | 类型 | 说明 |
---|---|---|
documentElement | DOMElement | XML 文档的根节点,允许直接访问文档各个子元素节点 |
documentURI | string | XML 文档的真实物理路径 |
encoding | string | XML 文档的编码方式 |
formatOutput | bool | 格式化输出,友好地保留缩进和空格 |
preserveWhiteSpace | bool | 文档保存时保留多余的空格输出 |
validateOnParse | bool | 解析 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(打开)
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(打开)
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(打开)
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(打开)
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(打开)
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"); // 亲,全部讲完了,记得好评呢~