php入门教程xml学习笔记
明确目标: 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()输出不准确
<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";
}
?>
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 "<<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 " />";
}
else echo "></<font color="#0000cc">$name</font>>";
$tag_complete = true;
}
else echo "</<font color="#0000cc">$name</font>>";
$character_data_on=false;
}
function characterdata($parser,$data) //定义回调函数
{
global $character_data_on;
global $tag_complete;
if((!$character_data_on)&&(!$tag_complete))
{
echo ">";
$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; //输出结果
xml 解析器。
语法: int xml_parser_create(string [encoding]);
返回值: 整数
函数种类: 资料处理
内容说明
本函数用来初始化一个新的 xml 解析器。参数 encoding 可省略,为 xml 使用的字符集,默认值为 iso-8859-1,其它尚有 us-ascii、utf-8 二种。成功则返回 parser 代码供其它函数使用,失败则返回 false 值。
*/
$xmlfile='test.xml'; //定义一个xml文件
$xmlparser=xml_parser_create(); //建立一个xml解析器
$fp=fopen($xmlfile,'r'); //打开一个文件并读取数据
while($xmldata=fread($fp,4096)) //循环读取文件内容
{
if(!xml_parse($xmlparser,$xmldata,feof($fp))) //解析xml数据,如果失败输出错误信息
{
die(print "error:".
xml_error_string(xml_get_error_code($xmlparser))."<br/>"."line:".
xml_get_current_line_number($xmlparser)."<br/>"."column:".
xml_get_current_column_number($xmlparser)."<br/>");
}
}
xml_parser_free($xmlparser); //释放xml解析器
/*
php 5 开始,自动侦测输入的 xml 的编码,因此 encoding 参数仅用来指定解析后输出数据的编码
在 php 5.0.0 和 5.0.1 总,默认输出的字符编码是 iso-8859-1,而 php 5.0.2 及以上版本是 utf-8。解析器支持的编码有 iso-8859-1, utf-8 和 us-ascii
bool xml_parser_free ( resource parser )
parser
指向要释放的 xml 解析器的指针。
如果 parser 参数没有指向一个合法的解析器,该函数将返回 false,否则将释放指定的解析器并返回 true
*/
$simple="<para><note>simple note</note></para>"; //定义xml数据
$p=xml_parser_create(); //创建xml解析器
xml_parse_into_struct($p,$simple,$vals,$index); //将数据解析到数组
xml_parser_free($p); //释放xml解析器
echo "index arrayn";
print_r($index); //输出结果数组
echo "nvals arrayn";
print_r($vals);
/*输出结果为:
index array
array
(
[para] => array
(
[0] => 0
[1] => 2
)
[note] => array
(
[0] => 1
)
)
vals array
array
(
[0] => array
(
[tag] => para
[type] => open
[level] => 1
)
[1] => array
(
[tag] => note
[type] => complete
[level] => 2
[value] => simple note
)
[2] => array
(
[tag] => para
[type] => close
[level] => 1
)
)
*/
相关文章
- 这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 这篇文章主要介绍了C#线程入门教程之单线程介绍,本文讲解了什么是进程、什么是线程、什么是多线程等内容,并给出了一个单线程代码示例,需要的朋友可以参考下...2020-06-25
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 这篇文章主要介绍了CocosCreator入门教程之用TS制作第一个游戏,对TypeScript感兴趣的同学,一定要看一下...2021-04-16
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
- 一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
- 引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
- 下面举一个很简单的?表达式的实现吧,其实它就是简单的if else哦。 <? $a = 5; //定义变数a=5 $b = 3; //定义变数b=5 $c = ($a==$b) ? ("yes") : ("no"); //如果...2016-11-25
- 现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略ReactJs的风采吧~~ 文章有点长,耐心读完,你会有很大收获哦...2021-04-05
- cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
- 那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
- CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
- php入门教程:php rtrim()实例教程 定义和用法 该rtrim ( )函数将删除空格或其他预先确定的性质从右侧的一个字符串。 语法 rtrim(string,charlist) 参数说明 字符...2016-11-25
- 这篇文章主要介绍了Golang极简入门教程(一):基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下...2020-05-01
- Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25
- 这篇文章主要介绍了Golang极简入门教程(三):并发支持,本文讲解了goroutine线程、channel 操作符等内容,需要的朋友可以参考下...2020-05-01
- PHP扩展开发不是所有开发者都会操作的一个东西,下面我来演示一个关于PHP扩展开发实现过程,各位同学有需要可进入参考。 我们先假设需要这样一个扩展,提供一个叫tao_s...2016-11-25