PHP之XML

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

PHP之XML_第1张图片
PHP之XML_第2张图片

php操作xml常规操作是:

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

PHP之XML_第3张图片

//创建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>";
}

PHP之XML_第4张图片

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>';
}

PHP之XML_第5张图片

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);

PHP之XML_第6张图片

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

PHP之XML_第7张图片

//添加节点
//返回一个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');

源文件

你可能感兴趣的:(PHP,xml)