php : DOM 操作 XML
DOM 操作 XML
基本用法
XML文件:
person.XML
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person>
<name sex='男'>keen</name>
<age>18</age>
<edu>高中</edu>
</person>
<person>
<name sex='女'>keen2</name>
<age>19</age>
<edu>初中</edu>
</person>
</persons>
person.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book type="脚本语言">
<name>php</name>
<price>48</price>
</book>
<book type="标记语言">
<name>xml</name>
<price>60</price>
</book>
</books>
- 获取 DOM
$doc = new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace = false; // 不保护空格, 即忽略掉空格
$doc->formatOutput = true; // 格式化输出, 保存 xml 的时候就不会太乱
$doc->load("./person.xml");
- 获取节点元素集合
$persons = $doc->getElementsByTagName("person");
- 获取元素集合的某一项
$firstChild = $persons->item(0);
- 获取某一元素的子元素
$childs = $firstChild->childNodes // 子元素集合
- 获取子元素自合的某一项
$child = $firstChild->childNodes->item(0)
- 获取元素的名
$firstChild->nodeName
- 获取元素的值
$child->nodeValue
- 获取某一元素的属性集合
$child->attributes
- 判断元素是否有属性
$child->attributes->length > 0 // >0, 说明有属性
- 获取属性的值或名
$node = $child->attributes->item(0);
$node->value; // 属性值
$node->name; // 属性名
//
// 或者指定获取某个属性的值
$firstChild->getAttribute('sex');
- 更新元素
$doc->documentElement->replaceChild($newNode, $oldNode);
- 移除元素
$node->parentNode->removeChild($node);
Demo
读取XML的值
以表格的形式输出
<?php
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false; // 不保护空格
$doc->load("./person.xml");
$persons = $doc->getElementsByTagName("person");
echo "<table border=1>";
// 输出标题
$firstChild = $persons->item(0);
echo "<tr>";
foreach($firstChild->childNodes as $child){
echo "<td>";
echo $child->nodeName;
echo "</td>";
}
echo "</tr>";
// 内容
foreach($persons as $person){
echo "<tr>";
foreach($person->childNodes as $child){
echo "<td>";
echo $child->nodeValue;
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
?>
创建 XML 文档
<?php
$arrs = array(
array('name'=>'php', 'type'=>'脚本语言'),
array('name'=>'xml', 'type'=>'标记语言'),
array('name'=>'c#', 'type'=>'动态语言')
);
$doc = new DOMDocument('1.0', 'utf-8'); // 设置版本号和字符编码
$doc->formatOutput = true; // 格式化输出
$books = $doc->createElement('books'); // 创建元素节点
foreach($arrs as $arr){
$book = $doc->createElement('book');
$name = $doc->createElement('name', $arr['name']); // 创建 name 元素节点并赋值
$book->appendChild($name);
$book->setAttribute('type', $arr['type']); // 设置元素属性并赋值
$books->appendChild($book);
}
$doc->appendChild($books);
$doc->save('books.xml');
echo "写入Success";
?>
递归遍历 XML
<?php
function getChilds($node){
echo "<ul>";
if($node->nodeType == 3){ // 1:元素节点, 2:属性节点, 3:值节点, 9:根节点
echo "<li>" . $node->nodeValue . "</li>";
}
else{
echo "<li>" . $node->nodeName . "</li>"; // 输出元素节点的名称
if($node->attributes->length > 0){ // 元素节点的属性个数大于0 : 此节点有属性
//echo "attr : " . $node->attributes->item(0)->value;
foreach($node->attributes as $attr){
echo "<li>" . $attr->value . "</li>"; // 输出属性节点的值
}
}
// 输出子元素
foreach($node->childNodes as $child){ // 遍历子元素
getChilds($child); // 递归输出
}
}
echo "</ul>";
}
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false; // 不保护空格
$doc->load("./books.xml");
$root = $doc->documentElement; // 获取最顶层元素
getChilds($root);
?>
结合 XPath 高效查询
<?php
/*
* XPath
*/
$doc = new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace = false;
$doc->load('./books.xml');
$xpath = new DOMXPath($doc);
// 查询所有的书
$query = '/books/book/name';
$result = $xpath->query($query);
echo "书名: <br>";
foreach($result as $nameNode){
echo $nameNode->nodeValue . "<br>";
}
echo "<br>==========<br>";
// 查询指定类型的书
$query = '/books/book[@type="动态语言"]/name';
$result = $xpath->query($query);
foreach($result as $nameNode){
echo $nameNode->nodeValue . "<br>";
}
echo "<br>==========<br>";
// 通过为止来查询
$query = "/books/book[position()>1]/name";
$result = $xpath->query($query);
foreach($result as $nameNode){
echo $nameNode->nodeValue . "<br>";
}
?>
SimpleXML基本使用
<?php
/*
* SimpleXML 演示
* 思路: 把 XML 字符串转成对象和数组
*/
$path = "./books.xml";
$xml = file_get_contents($path); // 获取 xml 字符串
$simple = new SimpleXMLElement($xml); // 把字符串转成数组, 此代表根节点
// 查询
echo "<table border=1>";
foreach($simple->book as $book){
$attr = $book->attributes(); // 获取元素节点的属性
echo "<tr>";
echo "<td>". $book->name . "</td>";
echo "<td>" . $book->price . "</td>";
echo "<td>" . $attr['type'] . "</td>";
echo "</tr>";
}
echo "</table>";
// 添加
/*
$book = $simple->addChild("book");
$book->addChild("name", "c++");
$book->addChild("price", "50");
$book->addAttribute("type", "动态语言");
$simple->saveXML($path);
echo "Add success";
*/
// 更新
/*
$book = $simple->xpath("/books/book[name='c#']"); // 找到 C#, 为数组
$book[0]->price = '100';
$simple->saveXML($path);
echo "Update Success";
*/
// 删除
// 使用 unset
$book = $simple->xpath("/books/book[name='c++']"); // 找到 c++
for($i=0; $i<count($simple->book); $i++){
$currentBook = $simple->book[$i];
if($currentBook->name == "c++"){
unset($simple->book[$i]);
}
}
$simple->saveXML($path);
?>
综合案例: XML 实现增删改查
传送门: -------->音乐信息管理
生活不止眼前, 还有诗和远方
php : DOM 操作 XML的更多相关文章
- php中通过DOM操作XML
DOM文档在js里早就接触过,知道DOM不但可以操作html文档,还可以操作XHTML,XML等文档,有着极强的通用性,下面我们通过两个小例子,看看在PHP中是如何用DOM操作XML文档的,和js中差 ...
- Java用DOM操作xml
JAXP DOM方式解析XML文档实例增删改查package jiexi; import javax.xml.parsers.DocumentBuilder; import javax.xml.par ...
- java使用DOM操作XML
XML DOM简介 XML DOM 是用于获取.更改.添加或删除 XML 元素的标准. XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个 ...
- DOM操作XML文件
一.IE中的XML(IE低版本才支持) 在统一的正式规范出来以前,浏览器对于 XML 的解决方案各不相同.DOM2 级提出了动态创建 XML DOM 规范,DOM3 进一步增强了 XML DOM. 所 ...
- PHP通过DOM操作XML
PHP XML操作类DOMDocument属性及方法 注意大小写一定不能弄错. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataT ...
- DOM 操作XML(CRUD)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架> ...
- java DOM 操作xml
1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...
- ajax——dom对xml和html的操作
上篇文章说到了dom的基础,dom能够操作xml和html,这次主要写利用dom的api去如何去操作xml和html文档. dom操作xml dom操作xml文档之前必须把xml文档装载到xml do ...
- DOM【介绍、HTML中的DOM、XML中的DOM】
什么是DOM? DOM(Document Object Model)文档对象模型,是语言和平台的中立接口. 允许程序和脚本动态地访问和更新文档的内容. 为什么要使用DOM? Dom技术使得用户页面可以 ...
随机推荐
- c++模板函数实例化的偏序机制
一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题: http://stackoverflow.com/questions/18283851/temp ...
- Python 字符串反转
方法一: 切片的方法 a = "hello"b = len(a)i = 1c = ""while i<=b: d = a[b-i] c += d i+=1 ...
- 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分
在实用VS编程的时候大家经常会遇到一个问题: 下面小编来为大家提供一个简单的解决方案: 1.在Windows中打开功能里输入regedit,回车打开注册表编辑器: 2.转到路径HKEY_LOCAL_M ...
- CentOS 6.2 SVN搭建 (YUM安装)
安装说明 安装了一下SVN服务器,本文没有与Apache整合,过程如下: 系统环境:CentOS-6.2安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN ...
- C与C++中的常用提高程序效率的方法
1.用a++和++a及a+=1代替a=a+1,用a--和--a及a-=1代替a=a-1 通常使用若把一个函数定义为内联函数,则在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代 ...
- 怎样给Myeclipse配置tomcat服务器
http://jingyan.baidu.com/article/4853e1e53465271909f72690.html Meclipse是java Web企业级开发中最流行的工具,java we ...
- MVC中使用EF增删改查,简单的例子
//这个是分页数据和总页数类 public class SummaryBase<TModel> { public SummaryBase(); public IList<TModel ...
- JavaScript随笔目录
DOM DOM节点 浏览器环境 遍历节点 DOM的基本属性 Attribute和自定义Property 在DOM中搜索元素 对文档进行操作
- 在Centos7服务器上搭建网关服务
准备搭建网关的服务器环境介绍: OS:Centos7.1 网络:一块网卡,能够上网(能够连接到更外层网络),IP为192.168.7.54 内存.CPU随意 以下命令的作用依次是: 开启ip_forw ...
- [已解决] java 增加 ALPN支持
添加javaVM参数: -Xbootclasspath/p:lib/alpn-boot-8.1.10.v20161026.jar 文章来源:http://www.cnblogs.com/gifisan ...