文章出處
文章列表
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 實現增刪改查
傳送門: -------->音樂信息管理
--------
生活不止眼前, 還有詩和遠方
文章列表
全站熱搜