文章出處

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 實現增刪改查

傳送門: -------->音樂信息管理


--------
生活不止眼前, 還有詩和遠方


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()