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

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

    生活不止眼前, 还有诗和远方

  • 相关阅读:
    python之模块和包
    python之常用模块一
    关于jQuery库的引用
    Python数据挖掘-相关性-相关分析
    Python数据挖掘-使用sklearn包
    Python数据挖掘-关键字提取
    Python数据挖掘-词云美化
    Python数据挖掘-词云
    Python数据挖掘-词频统计-实现
    Python数据挖掘-中文分词
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/6090953.html
Copyright © 2020-2023  润新知