PHP之XML

来源:互联网 发布:万惠事件知乎 编辑:程序博客网 时间:2024/06/05 12:41

xml跟html一样属于dom结构,存在节点
php操作xml就跟javascript操作html结构一样


这里写图片描述

php操作xml常规操作是:

加载或者创建xml文件
获取xmlDOm结构
对XML结构进行增删改查
保存文件

这里写图片描述


//创建xml文档<?php$book = array(    array('name'=>'php','type'=>'web'),    array('name'=>'java','type'=>'web'),    array('name'=>'html','type'=>'client'));//创建xml文档对象$dom = new domdocument('1.0','utf-8');$dom->formatOutput = true;//创建节点$books = $dom->createElement('books');foreach($book as $k=>$v){    $book = $dom->createElement('book');    $name = $dom->createElement('name',$v['name']);    //添加子节点    $books->appendChild($book);    $book->appendChild($name);    //添加属性    $book->setAttribute('type',$v['type']);}$dom->appendChild($books);//保存xml文件$dom->save('save.xml');echo 'save succ';
//创建成功<?xml version="1.0" encoding="utf-8"?><books>  <book type="web">    <name>php</name>  </book>  <book type="web">    <name>java</name>  </book>  <book type="client">    <name>html</name>  </book></books>
//简单获取xml<?php$dom = new DOMDocument();//加载xml文件$dom->load('save.xml');//获取元素节点$res = $dom->getElementsByTagName('book');for($i=0;$i<$res->length;$i++){    echo $res->item($i)->getElementsByTagName('name')->item(0)->nodeValue;}

这里写图片描述


load()接收两个参数:
第一个参数是文件名;第二个参数是libxml选项常量,传递LIBXML_NOBLANKS可以忽略空白点。或者在加载前使用preserveWhiteSpace忽略空白。

//递归获取xml元素名称与值<?php$dom = new domdocument();$dom->preserveWhiteSpace=false;$dom->load('save.xml');$root = $dom->documentElement;tree($root);function tree($root){    echo "<ul>";    if($root->nodeType==3){        echo "<li>";        echo $root->nodeValue;        echo "</li>";    }else{        echo "<li>";        echo $root->nodeName;        echo "</li>";        //判断是否存在属性        if($root->attributes->length>0){            foreach($root->attributes as $attr){                echo "<li>";                //获取属性值                echo $attr->value;                echo "</li>";            }        }        foreach($root->childNodes as $child){            tree($child);        }    }    echo "</ul>";}

这里写图片描述

xPath

通过dom结构定位节点,在数据量很大的情况下速度下降的很快,使用xpath快速定位节点

<?php$dom = new domdocument();$dom->preservewhitespace = false;$dom->load('save.xml');$xpath = new domxpath($dom);//根据路径查找$path = '/books/book/name';res($path,$xpath);//路径基础上增加属性过滤 @type <>= val$path = "/books/book[@type='client']/name";res($path,$xpath);//路径基础上增加位置选择 索引从0开始,位置从1开始$path = "/books/book[position()=2]/name";res($path,$xpath);//路径基础上选择最后一个位置$path = "/books/book[last()]/name";function res($path,$xpath){   $res = $xpath->query($path);   foreach($res as $node){    echo $node->nodeValue,'<br/>';   }    echo '<hr>';}

这里写图片描述

simpleXML

这是PHP5以后新增对xml文档的操作,相对于其它语言(java、C++)的独特特点,可以将XML的DOM结构转换为对象和数组来进行操作。


创建simpleXMLElement对象

//1$sim = simplexml_load_file('save.xml');//2$xml = file_get_contents('save.xml');$sim = new simplexmlelement($xml);//3$sim = simplexml_load_string($xml);
<?php$xml = file_get_contents('save.xml');$sim = new simplexmlelement($xml);echo '<pre>';var_dump($sim);

这里写图片描述

var_dump($sim->book);foreach($sim->book as $book){    $attr = $book->attributes();    echo $attr->type;    echo '-';    echo $book->name;    echo '</br>';}

这里写图片描述

//添加节点//返回一个simpleXML对象$book = $sim->addChild('book');$book->addChild('name','node');$book->addAttribute('type','web');$sim->saveXML('save.xml');
//更新节点$length = count($sim->book);$sim->book[$length-1]->name.='.js';$sim->saveXML('save.xml');
//删除节点for($i=count($sim->book)-1;$i>=0;$i--){    $book = $sim->book[$i];    $attr = $book->attributes();    if($attr->type=='web'){        unset($sim->book[$i]);    }}$sim->saveXML('save.xml');

源文件

0 0