php dom读取xml文档代码(1/4)

 更新时间:2016年11月25日 16:54  点击:1452

 

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

 1 中的 xml 包含一个图书列表。父标记 <books> 包含一组 <book> 标记,每个 <book> 标记又包含 <author>、<title> 和 <publisher> 标记。
当 xml 文档的标记结构和内容得到外部模式文件的验证后,xml 文档就是正确的。模式文件可以用不同的格式指定。对于本文来说,所需要的只是格式良好的 xml。
如果觉得 xml 看起来很像超文本标记语言(html),那么就对了。xml 和 html 都是基于标记的语言,它们有许多相似之处。但是,要着重指出的是:虽然 xml 文档可能是格式良好的 html,但不是所有的 html 文档都是格式良好的 xml。换行标记(br)是 xml 和 html 之间区别的一个好例子。这个换行标记是格式良好的 html,但不是格式良好的 xml:
<p>this is a paragraph<br>
with a line break</p>
这个换行标记是格式良好的 xml 和 html:
<p>this is a paragraph<br />
with a line break</p>
如果要把 html 编写成同样是格式良好的 xml,请遵循 w3c 委员会的可扩展超文本标记语言(xhtml)标准。所有现代的浏览器都能呈现 xhtml。而且,还可以用 xml 工具读取 xhtml 并找出文档中的数据,这比解析 html 容易得多。
使用 dom 库读取 xml
读取格式良好的 xml 文件最容易的方式是使用编译成某些 php 安装的文档对象模型 (dom)库。dom 库把整个 xml 文档读入内存,并用节点树表示它,如图 1 所示。
图 1. 图书 xml 的 xml dom 树

树顶部的 books 节点有两个 book 子标记。在每本书中,有 author、publisher 和 title 几个节点。author、publisher 和 title 节点分别有包含文本的文本子节点。
读取图书 xml 文件并用 dom 显示内容的代码如清单 2 所示。
清单 2. 用 dom 读取图书 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 - $publishern";
}
?>

public function parsexml($menus){
2         $result = array();
3         foreach($menus as $menu){
4             $tmparr = array();
5
6             //    处理空文本节点方式a
7             if( $menu->nodename !='#text'){
8
9                 //    检索子元素时跳跃过文本节点  - 处理空文本节点方式b
10                 for($i=1; $i<$menu->childnodes->length; $i+=2) {
11                     $anode = $menu->childnodes->item($i);
12
13                     //    子元素遍历
14                     $anode->childnodes->length > 1 ? $tmparr[$anode->nodename] = $this->parsexml( $anode->childnodes)
15                     : $tmparr[$anode->nodename] = $anode->nodevalue;
16                 }
17                 array_push($result,$tmparr);
18             }
19         }
20         return $result;
21     }
22
23
24
25         $doc = new domdocument();
26         $doc->load ( ‘a.xml’ );
27
28         //    第一种,有空文本节点
29         $menus = $doc->getelementsbytagname('sitemap')->item(0)->childnodes; 
30
31          //    第二种,明确指定标签,序列无空文本节点。但子元素仍然有空节点
32
33         $xpath = new domxpath($doc);
34         $query = "/sitemap/child::a";
35
36         $menus = $xpath->query($query);

明确目标: 1、理解xml的结构;2、如何动态建立xml文件;3、如何读取和修改xml文件

  一、 xml的结构是树形结构:

这个好理解。简单写一个:

 1 <pictures> 2   <picture> 3      <id>1</id> 4      <name>pic 1</name> 5   </picture> 6   <picture> 7      <id>2</id> 8      <name>pic 2</name> 9   </picture>10   <picture>11      <id>3</id>12      <name>pic 3</name>13   </picture>14  </pictures>
 

 

  二、我使用的php教程创建:

    1. 定义一个dom对象: $dom = new domdocument('1.0');

    2. 添加子元素:$dom->appendchild($dom->createelement("pictures"))

     内存中的原型是:<pictures></pictures>

     继续往里边加子元素:*->appendchild($dom->createelement("picture"));

     继续加: **->appendchild($dom->createelement("id"));

     不加子元素了,加节点: ***->appendchild($dom->createnode("1"))

     上面的*代表上上一行的代码;这样一来就可以写成一行:

       $dom->appendchild($dom->createelement("pictures"))->appendchild($dom->createelement("picture"))

       ->appendchild($dom->createelement("id"))->appendchild($dom->createnode("1"));

     现在内存中应该是这样的:<pictures><picture><id>1</id></picture></pictures>

     显然里要求还远,很容易看懵的。

      因此一般这么写: $pictures = $dom->appendchild($dom->createelement("pictures"));

               $picture = $pictures->appendchild($dom->createelement("picture"));

               $id = $picture->appendchild($dom->createelement("id"));

                      $id->appendchild($dom->createnode("1"));

      下面还可以接着创建name节点:

               $name = $picture->appendchild($dom->createelement("name"));

                   $name->appendchild($dom->createnode("pic 1"));

      接下来还要接着创建picture节点:

              $picture = $pictures->appendchild($dom->createelement("picture"));

      其实这些麻烦的事可以写个for循环来实现。

      生成xml文件:

              $dom->formatoutput = true;//设置格式化输出

              $dom->save("erhsh.xml");//保存xml文件

  三、读取xml文件。

      1、还是定义一个dom对象;$dom->new domdocument();

      2、加载xml文件:$dom->load("erhsh.xml");

      3、按照节点的名字取得节点集合:$dom->getelementbytagname("pictures");

      这种方法有点麻烦,参考文件:http://wenku.baidu.com/view/8f0c3c5177232f60ddcca163.html

    不过有一种我喜欢的方法:simplexml_load_file("erhsh.xml");

     此方法可以把xml文件的内容转换成对象的形式,使用"->"结和"[]"很容易去的xml的内容;

    但是在开发中还是遇到了一点问题:

    当执行:print_r($xml->pictures);时输出的是一个 simplexmlelement 对象,([picture] => array([0]=>array(...)[1]=>array(...)));

    再执行:print_r($xml->pictures->picture);输出的是n个分开的对象。

    执行:print_r($xml->pictures->picture[0]->id);输出的还是一个对象。这就很不理解,应该是一个字符串。 最后网上说是“迭代对象”,

    应该使用echo输出,print_r(), var_dump()输出不准确

xml 函数是 php 核心的组成部分。无需安装即可使用这些函数。
php xml parser 函数
php:指示支持该函数的最早的 php 版本。

函数 描述 php
utf8_decode() 把 utf-8 字符串解码为 iso-8859-1。 3
utf8_encode() 把 iso-8859-1 字符串编码为 utf-8。 3
xml_error_string() 获取 xml 解析器的错误描述。 3
xml_get_current_byte_index() 获取 xml 解析器的当前字节索引。 3
xml_get_current_column_number() 获取 xml 解析器的当前列号。 3
xml_get_current_line_number() 获取 xml 解析器的当前行号。 3
xml_get_error_code() 获取 xml 解析器错误代码。 3
xml_parse() 解析 xml 文档。 3
xml_parse_into_struct() 把 xml 数据解析到数组中。 3
xml_parser_create_ns() 创建带有命名空间支持的 xml 解析器。 4
xml_parser_create() 创建 xml 解析器。 3
xml_parser_free() 释放 xml 解析器。 3
xml_parser_get_option() 从 xml 解析器获取选项设置信息。 3
xml_parser_set_option() 为 xml 解析进行选项设置。 3
xml_set_character_data_handler() 建立字符数据处理器。 3
xml_set_default_handler() 建立默认的数据处理器。 3
xml_set_element_handler() 建立起始和终止元素处理器。 3
xml_set_end_namespace_decl_handler() 建立终止命名空间声明处理器。 4
xml_set_external_entity_ref_handler() 建立外部实体处理器。 3
xml_set_notation_decl_handler() 建立注释声明处理器。 3
xml_set_object() 在对象中使用 xml 解析器。 4
xml_set_processing_instruction_handler() 建立处理指令(pi)处理器。 3
xml_set_start_namespace_decl_handler() 建立起始命名空间声明处理器。 4
xml_set_unparsed_entity_decl_handler() 建立未解析实体定义声明处理器。 3

*/
$file="test.xml";            //定义xml文件
$character_data_on=false;         //定义布尔变量
$tag_complete=true;           //定义布尔变量
function startelement($parser,$name,$attrs)       //定义起始回调函数
{
  global $character_data_on;
  global $tag_complete;
  echo "&lt;<font color="#0000cc">$name</font>";
  if (sizeof($attrs))
  {
    while(list($k,$v)=each($attrs))
    {
      echo "<font color="#009900">$k</font>="<fontcolor="#990000">$v</font>"";
    }
  }
  $tag_complete=false;          //定义布尔型变量
  $character_data_on=false;         //定义布尔型变量
}
function endelement($parser,$name)       //定义终止回调函数
{
  global $fp;
  global $character_data_on;
  global $tag_complete;
  if(!$character_data_on)
  {
    $temp_fp=ftell($fp);
    $end_element_byte_index=xml_get_current_byte_index($parser);
    fseek($fp,$end_element_byte_index-2);
    $validator=fgets($fp,3);
    fseek($fp,$temp_fp);
    if($validator=="/>")
    {
      echo " /&gt";
    }
    else echo "&gt&lt/<font color="#0000cc">$name</font>&gt";
    $tag_complete = true;
  }
  else echo "&lt/<font color="#0000cc">$name</font>&gt";
  $character_data_on=false;
}
function characterdata($parser,$data)       //定义回调函数
{
  global $character_data_on;
  global $tag_complete;
  if((!$character_data_on)&&(!$tag_complete))
  {
    echo "&gt";
    $tag_complete=true;
  }
  echo "<b>$data</b>";
  $character_data_on=true;
}
$xml_parser=xml_parser_create();        //创建xml解析器
xml_parser_set_option($xml_parser,xml_option_case_folding,false); //对解析器进行设置
xml_set_element_handler($xml_parser,"startelement", "endelement");  //建立起止元素处理器
xml_set_character_data_handler($xml_parser,"characterdata");   //建立字符数据处理器
if(!($fp=fopen($file,"r")))           //如果文件打开失败
{
  die("could not open xml input");         //输出错误信息
}
echo "<pre>";
while($file_content=fread($fp,4096))         //循环读取内容
{
  if(!xml_parse($xml_parser,$file_content,feof($fp)))
  {
    die(sprintf("xml error: %s at line %d",
    xml_error_string(xml_get_error_code($xml_parser)),
    xml_get_current_line_number($xml_parser)));
  }
}
echo "</pre>";
xml_parser_free($xml_parser);          //释放xml解析器
?>

实例二

<?php
class xmlparser            //定义一个类
{
  var $xmlparser;            //类的属性
  function xmlparser()           //类的方法
  {
    $this->xmlparser=xml_parser_create();
    xml_set_object($this->xmlparser,$this);
    xml_set_character_data_handler($this->xmlparser,"char");
    xml_set_element_handler($this->xmlparser,"start_tag","end_tag");
  }
  function parse($data)           //类的方法
  {
    xml_parse($this->xmlparser,$data);
  }
  function parse_file($xmlfile)          //类的方法
  {
    $fp=fopen($xmlfile,'r');
    while($xmldata=fread($fp, 4096))
    {
      if(!xml_parse($this->xmlparser,$xmldata))
      {
        die( print "error:".
        xml_error_string(xml_get_error_code($this->xmlparser))."<br/>line:".
        xml_get_current_line_number($this->xmlparser)."<br/>column:".
        xml_get_current_column_number($this->xmlparser)."<br/>");
      }
    }
  }
  function start_tag($xmlparser,$tag,$attributes)      //类的方法
  {
    print $tag."<br/>";
  }
  function end_tag()            //类的方法
  {
  }
  function char($xmlparser,$data)         //类的方法
  {
    echo $data."<br/>";
  }
  function close_parser()           //类的方法
  {
    xml_parser_free($this->xmlparser);
  }
}
$myxmlparser=new xmlparser();         //为类初始化一个对象
$myxmlparser->parse_file("test.xml");        //调用类的读取文件方法
$myxmlparser->close_parser();          //调用类的关闭方法
/*
php xml parser 常量
constant
xml_error_none (integer)
xml_error_no_memory (integer)
xml_error_syntax (integer)
xml_error_no_elements (integer)
xml_error_invalid_token (integer)
xml_error_unclosed_token (integer)
xml_error_partial_char (integer)
xml_error_tag_mismatch (integer)
xml_error_duplicate_attribute (integer)
xml_error_junk_after_doc_element (integer)
xml_error_param_entity_ref (integer)
xml_error_undefined_entity (integer)
xml_error_recursive_entity_ref (integer)
xml_error_async_entity (integer)
xml_error_bad_char_ref (integer)
xml_error_binary_entity_ref (integer)
xml_error_attribute_external_entity_ref (integer)
xml_error_misplaced_xml_pi (integer)
xml_error_unknown_encoding (integer)
xml_error_incorrect_encoding (integer)
xml_error_unclosed_cdata_section (integer)
xml_error_external_entity_handling (integer)
xml_option_case_folding (integer)
xml_option_target_encoding (integer)
xml_option_skip_tagstart (integer)
xml_option_skip_white (integer)


$xml=(substr($response,strpos($response,"rnrn")+4));     //定义xml内容
$data=xmlrpc_decode_request($xml,$method);       //对xml译码
echo "method returned was:$method<hr/>n";       //输出结果
echo "<pre>";
var_dump($data);
echo "</pre>n";

//

$xml=(substr($response,strpos($response,"rnrn")+4));     //定义xml内容
$php教程vars=xmlrpc_decode($xml);         //将xml译码

//
$params="system.methodsignature";      //定义数据
$method="system.methodhelp";       //定义method
$request=xmlrpc_encode_request($method,$params);   //生成xml
echo $request; 

//

$params=1;         //定义php值
$response=xmlrpc_encode($params);    //为php值生成xml
echo $response;        //输出结果

[!--infotagslink--]

相关文章

  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   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
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • JS+CSS实现分类动态选择及移动功能效果代码

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

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • 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
  • PHP开发微信支付的代码分享

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

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

    本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。 当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点...2013-10-13
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • php导出csv格式数据并将数字转换成文本的思路以及代码分享

    php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
  • c# 对CSV文件操作(写入、读取、修改)

    这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03