DOM

document object model,文档对象模型,就是树形结构

节点的分类

  1. 元素节点
  2. 属性节点
  3. 值节点
  4. 注释节点
  5. 根节点(document才是根节点)

生成XML文档 xml的根节点为document节点

如果book下只有一个节点元素可以用此操作取得结点元素的值

 

/***********************************************************/

<?php // 将数组格式变换为xml格式的文档输入  
$array=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($array as $value)
{
$book=$doc->createElement('book');//创建book节点 
$name=$doc->createElement('name', $value['name']); //创建name节点,并赋值
$book->appendChild($book); //在元素的最后面添加子元素
$book->appendChild($name);
$book->setAttribute('type',$value['type']);
}
$doc->appendChild($books);
$doc->save('books.xml');
echo '写入成功';

/***********************************************************/

if($_POST){//对已有的xml文档进行添加操作
$doc=new DOMDocument();//不需要字符集和版本,因为已经存在
$doc->preserveWhiteSpace=false;//去掉空格元素的影响
$doc->formatOutput=true;//格式化输出
$path='./books.xml';//将文件路径变为变量,以后好修改
$doc->load($path);//对xml文档加载
$book=$doc->createElement('book');//创建book节点
$name=$doc->createElement('name',$_POST['name']);//创建name节点
$price=$doc->createElement('price',$_POST['price']);//创建price节点
$book->appendChild($name);//改变xml中包含的顺序
$book->appendChild($price);
$book->setAttribute('type', $_POST['type']);//设置book节点的属性
$books=$doc->documentElement;//创建books节点
$books->appendChild($book);//
if($doc->save($path))//保存xml文档到硬盘
{
header('location:books_admin.php');
}
else
{
echo '添加失败';
}
}

/***********************************************************/

//删除节点

<input type="button" value="删除" onclick="if(confirm('确定要删除吗'))location.href='books_del.php?index=<?php echo $i?>'" 

//传入要删除的下标 通过get方式

$doc=new DOMDocument();
$doc->preserveWhiteSpace=false;
$doc->formatOutput=true;
$doc->load('books.xml');
$index=$_GET['index'];
$book=$doc->getElementsByTagName('book')->item($index);
$book->parentNode->removeChild($book);
$doc->save('books.xml');
header('location:books_admin.php');

/***********************************************************/

修改

<input type="button" value="修改" onclick="location.href='books_modify.php?index=<?php echo $i?>'"

$index=$_GET['index'];
if(!is_numeric($index))//确认是否存在
die('非法操作');
$doc=new DOMDocument();
$doc->preserveWhiteSpace=false;
$path='./books.xml';
$doc->load($path);
$oldbook=$doc->getElementsByTagName('book')->item($index);
if($_POST){
$newbook=$doc->createElement('book');
$name=$doc->createElement('name',$_POST['name']);
$price=$doc->createElement('price',$_POST['price']);
$newbook->setAttribute('type', $_POST['type']);
$newbook->appendChild($name);
$newbook->appendChild($price);

$root=$doc->documentElement->replaceChild($newbook, $oldbook); //替换节点
$doc->save($path);
header('location:books_admin.php');
}
?>

/***********************************************************/

递归遍历xml

值节点的名称是“#text”,根节点的名称是“#document”

<?php

//递归XML文档  适合xml通用操作,但是消耗资源

function getChilds($node){

    echo "<ul>";

    if($node->nodeType==3){

        echo "<li>".$node->nodeValue."</li>";   //取出节点的值

    }

    else

    {

        echo "<li>".$node->nodeName."</li>";    //取出元素节点的名称

        if($node->attributes->length>0) //节点的属性的个数大于0,表示此节点有属性

        {

            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;  //不保护空格,就是导入XML的时候去掉空白字符

$doc->load('books.xml');

$root=$doc->documentElement;    //获得最顶层元素

getChilds($root);

 

posted on 2016-09-17 16:12  冬_雪_飘  阅读(2248)  评论(0编辑  收藏  举报