当前位置:编程学习 > XML/UML >>

SimpleXML学习笔记

SimpleXML学习笔记 

simplexml 使用实例

搞了几天php处理xml文件,终于有点头绪,记录下来分享一下。
simplexml 是php处理xml文件的一个方法,另一个是dom处理,这里只说simplexml。
目前php处理xml用的比较多,比较成熟的还是dom。但dom在速度和代码量上还是比较受人诟病的。

simplexml的有些函数需要比较高版本的php,建议是php5.2以上。

一,新建xml

方法1(普通新建文件):

$fp=fopen('111.xml','w');
 $xmlContent='<?xml version="1.0" encoding="utf-8" ?> ';
 $xmlContent.='<navlist>';
 $xmlContent.='<nav id="1">';
 $xmlContent.='<name>我我我</nname> ';
 $xmlContent.='<color>#000000</ncolor> ';
 $xmlContent.='</nav>';
 
 $xmlContent.='<nav id="2">';

 $xmlContent.='<name>你你你</nname> ';
 $xmlContent.='<color>#ffffff</ncolor> ';
 $xmlContent.='</nav>';
 
 $xmlContent.='<nav id="3">';
 $xmlContent.='<nname>他他他</nname> ';
 $xmlContent.='<ncolor>#cccccc</ncolor> ';
 $xmlContent.='</nav>';
 
 $xmlContent.='</navlist>';
 fwrite($fp,$xmlContent);
 fclose($fp);

 

方法2(使用simplexml新建):

$fp=fopen(111.xml','w');
 $xmlContent='<?xml version="1.0" encoding="utf-8" ?><navlist></navlist>';
 fwrite($fp,$xmlContent);
 fclose($fp);


 $xml=simplexml_load_file('111.xml');


 $app=$xml->addChild('nav');
 $app->addAttribute('id',"1");
 $app->addChild('name','我我我');
 $app->addChild('color','#000000');
 
 $app=$xml->addChild('nav');
 $app->addAttribute('id',"2");
 $app->addChild('name','你你你');
 $app->addChild('color','#ffffff);
 
 $app=$xml->addChild('nav');
 $app->addAttribute('id',"3");
 $app->addChild('name','他他他');
 $app->addChild('color','#cccccc);


 $xml->asXML('111.xml');

 

可以看到第一种方法其实只是普通的写入文件,第二种方法才是使用simplexml新建xml文件,但为什么我要把第一种普通方法放前面呢?因为本人测试了一下两种方法的运行时间,发现第一种方法使用的时间更少,所以建议使用普通的新建文件方法新建xml文件就行了!

新建的文件结构如下:

<?xml version="1.0" encoding="utf-8"?>
<navlist>
 <nav id="1">
  <name>我我我</nname>
  <color>#000000</ncolor>
 </nav>
 <nav id="2">
  <name>你你你</nname>
  <color>#ffffff</ncolor>
 </nav>
 <nav id="3">
  <name>他他他</nname>
  <color>#cccccc</ncolor>
 </nav>
</navlist>

 

二,读取xml

     if($xml=simplexml_load_file('111.xml')){
          foreach($xml->nav as $list){
                       $value[]=get_object_vars($list);
          }
     }else{
              echo('load xml error!');
     }

get_object_vars函数是把对象转化为数组,这样$value就是一个Php的普通数组了,大家可以print_r一下这个数组,Php数组的读取就不用我说了吧。

三,修改xml

1,新建节点

 $xml=simplexml_load_file('111.xml');
 $app=$xml->addChild('nav');
 $app->addAttribute('id',"4");
 $app->addChild('name','它它它');
 $app->addChild('color','#000000');
 $xml->asXML(111.xml');

将追加作为最后一个节点

 

2,修改节点

 $xml=simplexml_load_file('111.xml');

 $xg=$xml->xpath("/navlist/nav[@id=‘3’]"); 
 $xg[0]->name="他啊他啊";
 $xg[0]->color="#444444";
 $xml->asXML(111.xml');

修改了nav属性id为3的节点

 

3,删除节点

删除节点用unset函数就行,但要删除指定节点比较麻烦,删除指定节点只能使用节点的索引值。

比如删除第二个节点(id为2的):

$xml=simplexml_load_file('111.xml');

unset($xml->nav[1]);

$xml->asXML(111.xml');

索引从0开始,所以第二个节点的索引是1。

如果想通过指定的属性删除,则需要循环所有节点获取指定属性的节点索引
如下:

$xml=simplexml_load_file('111.xml');

$i=0;

 foreach($xml as $dup){
  $sc=$dup->attributes();
  if($sc['id']==2){
   unset($xml->nav[$i]);
  }
  $i++;
 }

$xml->asXML('111.xml');

 

四,删除xml

if(file_exists('111.xml')){
    unlink('111.xml');
 }

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------


相关的三个代码文件:
data.dtd  定义XML合法词汇
data.xml  XML文档
index.php 主索引文件

--------------------------------------------------------------------------------

代码如下:

data.dtd

view plain
<!ELEMENT friendLinkLib (friendLink)> 
<!ELEMENT friendLink (name, url, info, logoPath, qqMsn)> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT url (#PCDATA)> 
<!ELEMENT info (#PCDATA)> 
<!ELEMENT logoPath (#PCDATA)> 
<!ELEMENT qqMsn (#PCDATA)> 
<!ATTLIST friendLink id CDATA #REQUIRED> 
<!ATTLIST friendLink isPass (0|1) "0"> 
<!ATTLIST friendLink orderId CDATA #IMPLIED> 
<!ATTLIST friendLink isImage (0|1) "1"> 
<!ATTLIST friendLink isDisplay (0|1) "1"> 
<!ATTLIST friendLink position (supe|bbs|home) "supe"> 
 

data.xml

view plain
<?xml version="1.0" encoding="gbk"?> 
<!DOCTYPE FriendLink SYSTEM "http://localhost/eg/data.dtd"> 
<friendLinkLib> 
    <friendLink orderId="0" id="1" position="supe"> 
        <name>邯城正午</name> 
        <url>http://www.cityxii.cn</url> 
        <info>邯郸人的网上家园</info> 
        <logoPath>http://localhost/images/xmllogo.jpg</logoPath> 
       

补充:Web开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,