php xml读写操作实现代码

 更新时间:2016年11月25日 16:54  点击:1319
文章从最基础的什么是xml到最终于用实例告诉你如何利用php来读,写,删除,编辑xml文档,是一篇不错的xml讲解文档,有需要的同学可以收藏本文章。

什么是XML?
XML(eXtensible Markup Language)是国际标准化组织的标准通用标记语言SGML的子集。由以下规范组成:

可扩展样式语言(eXtensible Sytle Language , XSL)
XML链接语言(XML Linking Language,包括Xpath、Xlink和Xpointer)
XML名称空间(XML Namespace)
在PHP5之前的版本对XML的处理存在很多的问题,例如XML工具之间只具有简单的关联、每个工具不能一起协同工作等,PHP5中的新XML扩展具有下列特点:

能够像一个整体一样协调工作
是一个标准化的XML库:libxml2
完全遵循W3C规范
更有效地处理数据
是你工作中合适的XML工具
HTML和XML区别与联系?
HTML和XML都是SGML的子集,所以他们有很大的相似性。下面是XML相对于HTML具有的独特性:

可扩展性,用以定义需要的新标记。这对于今天的web是很有意义的
结构,用于表示任意复杂程度的数据。从某种意义上说是一个小型的关系数据库
校验,用以检查数据的结构正确性。通过DTD约束可以达到这一目的。
媒体无关性,以多种格式发布内容。网页、手机显示的wml、其他媒体终端的显示等
厂商和平台中立
数据的表示与内容分离(这是与html本质区别,但现在流行的DIV+CSS设计思路与这种近似)
XML的元素区分大小写
任何元素都需要有结束标记
XML只有一个根元素
属性必须加上引号
一个完整的XML长什么样子?

 代码如下 复制代码
<?xml version="1.0"?>
<shows>
    <show>
        <name>Simpsons</name>
        <channel>FOX</channel>
        <start>8:00 PM</start>
        <duration>30</duration>
    </show>
    <show>
        <name>Law & Order</name>
        <channel>NBC</channel>
        <start>8:00 PM</start>
        <duration>60</duration>
    </show>
</shows>

  

形式良好的XML文档须具备下列特征:

每一个元素有一个开始和结束标记
文档有且只有一个根元素,其他的所有元素都是它的子元素
正确的格式化空元素
标记的大小写匹配
正确的嵌套
属性值必须用引号
实体在引用之前必须声明
实体不能循环指向自身
通过DOM生成XML
 

 代码如下 复制代码

// 创建一个新的文档$dom = new DOMDocument('1.0');
// 创建一个根元素<book>并将其添加到文档$book = $dom->appendChild($dom->createElement('book'));
// 创建一个title子元素,并添加到$book中
$title = $book->appendChild($dom->createElement('title'));
// 设置title元素的文本及cover属性
$title->appendChild($dom->createTextNode('PHP Cookbook'));
$title->setAttribute('cover', 'soft');
// 创建并将author元素添加到$book中
$sklar = $book->appendChild($dom->createElement('author'));
//添加文本到author节点$sklar->appendChild($dom->createTextNode('Sklar'));

$trachtenberg = $book->appendChild($dom->createElement('author'));
$trachtenberg->appendChild($dom->createTextNode('Trachtenberg'));

// 输出完美格式化的XML文档$dom->formatOutput = true;
echo $dom->saveXML();输出内容如下:

 代码如下 复制代码
<?xml version="1.0"?>
<book?>
  <cover="soft">PHP Cookbook</title>
</book>

用PHP解析已经存在的XML文件
常用有三种方式来解析XML文件

对于简单文件采用SimpleXML
对于复杂的XML文件采用DOM扩展来实现
对于大型XML文件采用XMLReader扩展来实现
XML示例文件如下(address-book.xml):

 代码如下 复制代码

<?xml version="1.0"?>
<address-book>
    <person id="1">
        <!--David Sklar-->
        <firstname>David</firstname>
        <lastname>Sklar</lastname>
        <city>New York</city>
        <state>NY</state>
        <email>sklar@php.net</email>
    </person>

    <person id="2">
        <!--Adam Trachtenberg-->
        <firstname>Adam</firstname>
        <lastname>Trachtenberg</lastname>
        <city>San Francisco</city>
        <state>CA</state>
        <email>amt@php.net</email>
    </person>
</address-book>

  

通过SimpleXML方式:

 代码如下 复制代码

$sx = simplexml_load_file('address-book.xml');

foreach ($sx->person as $person) {
    $firstname_text_value = $person->firstname;
    $lastname_text_value = $person->lastname;

    print "$firstname_text_value $lastname_text_valuen";

}通过DOM扩展:

 

 代码如下 复制代码

$dom = new DOMDocument;
$dom->load('address-book.xml');

foreach ($dom->getElementsByTagname('person') as $person) {
    $firstname = $person->getElementsByTagname('firstname');
    $firstname_text_value = $firstname->item(0)->firstChild->nodeValue;

    $lastname = $person->getElementsByTagname('lastname');
    $lastname_text_value = $lastname->item(0)->firstChild->nodeValue;

    print "$firstname_text_value $lastname_text_valuen";
}

通过XMLReader扩展:

 代码如下 复制代码

$reader = new XMLReader();
$reader->open('card-catalog.xml');

while ($reader->read()) {
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == 'author') {
        $reader->read();
        print $reader->value . "n";
    }
}

用XPath来查询信息http://www.111cn.net
在SimpleXML和DOM扩展中都有XPath

 代码如下 复制代码

//SimpleXml示例
$emails = $s->xpath('/address-book/preson/email');

//DOM扩展示例

 代码如下 复制代码
$xpath = new DOMXPath($dom);
$email = $xpath->query('/address-book/preson/email');验证XML文档是否合法

在PHP中,DOM扩展支持基于DTD,XML Schema和RelaxNG的验证,而SimpleXML则只提供了XML Schema验证。

XML内容为UTF-8格式
如果数据来源为其他格式,需要经过编码为UTF-8格式,下面是通过iconv库进行转换的示例

 代码如下 复制代码

$utf_8 = iconv('ISO-8859-1', 'UTF-8', $iso_8859_1);

本文章详细的介绍了关于simplexml_load_file函数的用法,有需要了解的同学可以看看本函数详细实例。

表面看到的不一定是真的,file_get_contents或者curl远程抓一下,看其是否是一个有效的XML
特殊字符是会引起simplexml_load_file解析XML失败的,函数会报错

定义和用法
simplexml_load_file() 函数把 XML 文档载入对象中。

如果失败,则返回 false。

语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 XML 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 Libxml 参数。
ns 可选。
is_prefix 可选。

实例

例子 1. Interpret an XML document

 代码如下 复制代码

<?php
// The file test.xml contains an XML document with a root element
// and at least an element /[root]/title.

if (file_exists('test.xml')) {
    $xml = simplexml_load_file('test.xml');

    var_dump($xml);
} else {
    exit('Failed to open test.xml.');
}
?> 

This script will display, on success:

SimpleXMLElement Object
(
  [title] => Example Title
  ...
)
 

At this point, you can go about using $xml->title and any other elements.

 

第一家比较诡异,看源代码及IE页面,毛问题没有,函数就是报错。后来想了个办法,file_get_contents一下,发现丫的在XML数据前面和后面分别有一串数字。于是XML无法顺利解析,这个分析起来还好些,而另一个就堪称头疼了。

XML格式如下:

 代码如下 复制代码

<Result value="true" message="Success!">
  <Item ID="8861" UserName="30121740" NickName="&#x1A;ǒˇFEΙでァ" Grade="16" Repute="168" Sex="false" WinCount="138" TotalCount="229" ConsortiaName="圣域" Rename="false" ConsortiaRename="false" EscapeCount="0" IsFirst="31" FightPower="3032" />
</Result>

初步分析是由于 里面NickName乱码导致,于是试验另一地址:

 代码如下 复制代码

<Result value="true" message="Success!">
  <Item ID="7" UserName="13792776" NickName="龙哥" Grade="1" Repute="313119" Sex="true" WinCount="0" TotalCount="0" ConsortiaName="" Rename="false" ConsortiaRename="false" EscapeCount="0" IsFirst="34" FightPower="0" />
</Result>

毛问题没有,很显然是这个NickName乱码造成的。于是开始了漫长且无奈的沟通,不过人家合作方不认为自己的文件格式有问题


返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。


simplexml_load_file解析xml详细实例
xml文档格式如下

 代码如下 复制代码
<?xml version="1.0" encoding="utf-8"?>
<list>
    <company>武汉xxx公司</company>
    <user>
        <name>张三</name>
        <age sex="未知">a</age>
        <height>1</height>
    </user>
    <user>
        <name>李四</name>
        <age sex="女">b</age>
        <height>2</height>
    </user>
    <user>
        <name>王五</name>
        <age sex="男">c</age>
        <height>3</height>
    </user>
    <town parent="0" id="1">台北</town>
    <town parent="1" id="2">板桥</town>
    <town parent="0" id="3">桃园</town>
</list>

php解析代码
*/

 代码如下 复制代码

header("content-type:text/html; charset=utf-8"); //设置编码
$xml = simplexml_load_file('a.xml');  //载入xml文件 $lists和xml文件的根节点是一样的
echo $xml->company."<br>";
echo $xml->town."<br>id:";
echo $xml->town['id']."<br>parent:";
echo $xml->town['parent']."<br>";

echo "<br>循环读取:<br>";
foreach($xml->user as $users){     //有多个user,取得的是数组,循环输出
    echo "-------------------<br>";
    echo "姓名:".$users->name."<br>";
    echo "编号:".$users->age."<br>";
    echo "性别:".$users->age['sex']."<br>";
    echo "序号:".$users->height."<br>";
}

echo "<br>循环读取:<br>";
foreach($xml->town as $towns){     //有多个user,取得的是数组,循环输出
    echo "-------------------<br>";
    echo "id:".$towns['id']."<br>";
    echo "归属:".$towns['parent']."<br>";
    echo "地区:".$towns."<br>";
}


/*
定义和用法
simplexml_load_file() 函数把 xml 文档载入对象中。

如果失败,则返回 false。

语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 xml 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 libxml 参数。
ns 可选。
is_prefix 可选。

文章介绍了三种方式来读取xml文件分别是new DOMDocument(),正则解析xml,用parser函数来读取xml数据,这些方法都是可行的,但第一种和最后一种要好一些。
 代码如下 复制代码

<?php
  $doc = new DOMDocument();
  $doc->load( 'books.xml' );
 
  $books = $doc->getElementsByTagName( "book" );
  foreach( $books as $book )
  {
  $authors = $book->getElementsByTagName( "author" );
  $author = $authors->item(0)->nodeValue;
 
  $publishers = $book->getElementsByTagName( "publisher" );
  $publisher = $publishers->item(0)->nodeValue;
 
  $titles = $book->getElementsByTagName( "title" );
  $title = $titles->item(0)->nodeValue;
 
  echo "$title - $author - $publisher/n";
  }
  ?>


正则解析

 代码如下 复制代码
<?php
  $xml = "";
  $f = fopen( 'books.xml', 'r' );
  while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
  fclose( $f );
 
  preg_match_all( "//<book/>(.*?)/<//book/>/s",
  $xml, $bookblocks );
 
  foreach( $bookblocks[1] as $block )
  {
  preg_match_all( "//<author/>(.*?)/<//author/>/",
  $block, $author );
  preg_match_all( "//<title/>(.*?)/<//title/>/",
  $block, $title );
  preg_match_all( "//<publisher/>(.*?)/<//publisher/>/",
  $block, $publisher );
  echo( $title[1][0]." - ".$author[1][0]." - ".
  $publisher[1][0]."/n" );
  }
  ?>


books.xml文件如下

 代码如下 复制代码
<books>
  <book>
  <author>Jack Herrington</author>
  <title>PHP Hacks</title>
  <publisher>O'Reilly</publisher>
  </book>
  <book>
  <author>Jack Herrington</author>
  <title>Podcasting Hacks</title>
  <publisher>O'Reilly</publisher>
  </book>
  </books>


下面就给大家举一个小小的例子用parser函数来读取xml数据:

 

 代码如下 复制代码

<?php
$parser = xml_parser_create(); //创建一个parser编辑器
xml_set_element_handler($parser, "startElement", "endElement");//设立标签触发时的相应函数 这里分别为startElement和endElenment
xml_set_character_data_handler($parser, "characterData");//设立数据读取时的相应函数
$xml_file="1.xml";//指定所要读取的xml文件,可以是url
$filehandler = fopen($xml_file, "r");//打开文件

 


while ($data = fread($filehandler, 4096))
{
    xml_parse($parser, $data, feof($filehandler));
}//每次取出4096个字节进行处理

fclose($filehandler);
xml_parser_free($parser);//关闭和释放parser解析器


$name=false;
$position=false;
function startElement($parser_instance, $element_name, $attrs)        //起始标签事件的函数
 {
   global $name,$position; 
   if($element_name=="NAME")
   {
   $name=true;
   $position=false;
   echo "名字:";
  }
  if($element_name=="POSITION")
   {$name=false;
   $position=true;
   echo "职位:";
  }
}

function characterData($parser_instance, $xml_data)                  //读取数据时的函数
{
   global $name,$position;
   if($position)
    echo $xml_data."<br>";
    if($name)
     echo $xml_data."<br>";
}

function endElement($parser_instance, $element_name)                 //结束标签事件的函数
{
 global $name,$position;
$name=false;
$position=false; 
}

?>

xml文件代码如下:

 

 代码如下 复制代码

<?xml version="1.0"?>
<employees>
<employee>
<name>张三</name>
<position age="45">经理</position>
</employee>
<employees>
<employee>
<name>李四</name>
<position age="45">助理</position>
</employee>
</employees>

parser是php内置的一个用来处理xml的解析器,它的工作由三个事件组成:起始标签、 读取数据、结束标签。

也就是说在对xml进行处理的时候每当遇到起始标签、数据和结束标签的时候函数会做相应的动作来完成对xml数据的转换。

前面的mysql.php 是封装的mysql数据库功能,单例模式,所以取对象是静态方法 mysql::getObject(); 代码很简单
 代码如下 复制代码

include 'mysql.php';
$mysql= mysql::getObject();
$mysql->query("SELECT * FROM post");


$xml = new XMLWriter();

$xml->openUri('hello.xml'); //  or 'php://output'

$xml->setIndentString('   ');
$xml->setIndent(true);
// start
$xml->startDocument('1.0', 'UTF-8');

// <rss version="2.0">
$xml->startElement('rss');
   $xml->writeAttribute('version','2.0');
  
 // <channel>
 $xml->startElement('channel');
     // title
     $xml->startElement('title');
          $xml->text('title');
     $xml->endElement();
     // link
     $xml->startElement('link');
          $xml->text('http://foodstory.me/post/');
     $xml->endElement();
     // description
     $xml->startElement('description');
          $xml->text('');
     $xml->endElement();
     // language
     $xml->startElement('language');
          $xml->text('zh-cn');
     $xml->endElement();
     // category
     $xml->startElement('category');
          $xml->text('IT');
     $xml->endElement();
     // copyright
     $xml->startElement('copyright');
          $xml->text('copyright 2011 foodstory.me');
     $xml->endElement();

     // for item
     while( $row = $mysql->fetch() )
     {
      $xml->startElement('item');
         // title
        $xml->startElement('title');
             $xml->text( $row['title']);
        $xml->endElement();
        // link
        $xml->startElement('link');
             $xml->text( 'http://foodstory.me/post/'.$row['id'].'.html');
        $xml->endElement();
        // description
        $xml->startElement('description');
             $xml->text( $row['text'] );
        $xml->endElement();
        // pubDate
        $xml->startElement('pubDate');
             $xml->text( date('D, d M Y H:i:s T', $row['time']) );
        $xml->endElement();
       
        // category tag author need to write .over
      $xml->endElement(); // item
     }
 $xml->endElement(); // channel
$xml->endElement();  // rss

$xml->endDocument();
// $xml->flush();

openUri('') 方法的参数可以是一个文件,那么xml数据就写入到这个文件
或者 php://output 输出到缓冲区,然后 flush方法输出到页面

与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。

$json_string='{"id":1,"name":"foo","email":"foo@foobar.com","interest":["wordpress","php教程"]} ';
$obj=json_decode($json_string);
echo $obj->name; //prints foo
echo $obj->interest[1]; //prints php
PHP解析XML 数据

$xml_string="<?xml version='1.0'?>
<users>
<user id='398'>
<name>Foo</name>
<email>foo@bar.com</name>
</user>
<user id='867'>
<name>Foobar</name>
<email>foobar@foo.com</name>
</user>
</users>";

//load the xml string using simplexml
$xml = simplexml_load_string($xml_string);

//loop through the each node of user
foreach ($xml->user as $user)
{
//access attribute
echo $user['id'], ' ';
//subnodes are accessed by -> operator
echo $user->name, ' ';
echo $user->email, '<br />';
}

[!--infotagslink--]

相关文章

  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • PHP+jQuery翻板抽奖功能实现

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • C# 向二进制文件进行读写的操作方法

    该例子使用 BinaryStream 和 BinaryWriter 对二进制文件进行读写操作先上代码再根据我理解的所分享给各位朋友...2020-06-25
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24