您的位置:首页 > 编程语言 > PHP开发

php : DOM 操作 XML

2016-11-22 20:17 656 查看

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 实现增删改查

传送门: -------->音乐信息管理

--------

生活不止眼前, 还有诗和远方
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: