Web_PHP_PHP XML操作浅谈;

来源:互联网 发布:上海心动网络怎么样 编辑:程序博客网 时间:2024/06/05 22:41
PHP XML 2015-1-2 8:59
对于工作效率来说,讲究的是:快准狠!


一、PHP XML Expat 解析器
引言:内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能。


1、什么是 XML?
前言:XML 用于描述数据,其焦点是数据是什么。XML 文件描述数据的结构。在 XML 中,没有预定义的标签。您必须定义自己的标签。


2、基本XML解析器类型
(1)、基于树型的解析器
说明:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供API 来访问树中的元素。例如文档对象模型 (DOM)。
(2)、基于事件的解析器
说明:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。


3、什么是 Expat?
前言:如需读取和更新(创建并处理)XML 文档,您需要 XML 解析器。
说明:Expat 解析器是基于事件的解析器。基于事件的解析器集中在 XML 文档的内容,而不是它们的结果。正因如此,基于事件的解析器能够比基于树的解析器更快地访问数据。


4实例解说
->Xml
<from>John</from>
->Expat
解说:基于事件的解析器把上面的 XML 报告为一连串的三个事件:开始元素:from;开始 CDATA 部分, 值:John;关闭元素:from;
切记:上面的 XML 范例包含形式良好的 XML。不过这个例子是无效的 XML,因为没有与它关联的文档类型声明 (DTD),也没有内嵌的 DTD。不过,在使用 Expat 解析器时,这没有区别。Expat 是不检查有效性的解析器,忽略任何 DTD。作为一款基于事件、非验证的 XML 解析器,Expat 快速且轻巧,十分适合 PHP 的 web 应用程序。
注释:XML 文档必须形式良好,否则 Expat 会生成错误。


5、安装
说明:XML Expat 解析器是 PHP 核心的组成部分。无需安装就可以使用这些函数。


6、解析实例
(1)、XML文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>cyb</to>
<from>tl</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(2)、初始化XML解析器
前言:要在 PHP 中初始化 XML 解析器,为不同的 XML 事件定义处理器,然后解析这个 XML 文件。
<?php
///1、初始化解析器
$parser=xml_parser_create();


///2、事件函数
// 元素开始函数
function start($parser,$element_name,$element_attrs)
{
 switch($element_name)
 {
   case "NOTE":
   echo "-- Note --<br />";
   break; 
   case "TO":
   echo "To: ";
   break; 
   case "FROM":
   echo "From: ";
   break; 
   case "HEADING":
   echo "Heading: ";
   break; 
   case "BODY":
echo "Message: ";
 }
}


// 元素结束函数
function stop($parser,$element_name)
{
echo "<br />";
}


// 数据处理函数
function char($parser,$data)
{
echo $data;
}


///3、事件监听
// 指定元素监听
xml_set_element_handler($parser,"start","stop");


// 指定数据监听
xml_set_character_data_handler($parser,"char");


///4、 打开XML文件
$fp=fopen("test.xml","r");


///5、 读取XML数据
while ($data=fread($fp,4096))
{
/// 6、解析
xml_parse($parser,$data,feof($fp)) or 
die (sprintf("XML Error: %s at line %d",  xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser)));
}


///7、释放解析器
xml_parser_free($parser);


?>
(3)、结果输出
-- Note --
To: George
From: John
Heading: Reminder
Message: Don't forget the meeting!
(4)、工作原理
通过 xml_parser_create() 函数初始化 XML 解析器;
创建配合不同事件处理程序的的函数;
添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数;
添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数;
通过 xml_parse() 函数来解析文件 "test.xml";
万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明;
调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存;




二、PHP XML DOM
引言:内建的 DOM 解析器使在 PHP 中处理 XML 文档成为可能。


1、什么是 DOM?
前言:W3C DOM 提供针对 HTML 和 XML 文档的标准对象集,以及用于访问和操作这些文档的标准接口。
说明:W3C DOM 被分为不同的部分 (Core, XML 和 HTML) 和不同的级别 (DOM Level 1/2/3):
>Core DOM - 为任何结构化文档定义标准的对象集;
>XML DOM - 为 XML 文档定义标准的对象集;
>HTML DOM - 为 HTML 文档定义标准的对象集;


2、XML 解析
前言:如需读取和更新(创建并处理)一个 XML 文档,您需要 XML 解析器。
(1)、基本 XML 解析器类型
基于树型的解析器:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供 API 来访问树中的元素,例如文档对象模型 (DOM)。
基于事件的解析器:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理,例如PHP XML Expat解析器。
(2)、DOM解析器解析原理
说明:DOM 解析器是基于树的解析器。
->XML 文档片段
<?xml version="1.0" encoding="ISO-8859-1"?>
<from>John</from>
->DOM解析原理
XML DOM 把 XML 视为一个树形结构:Level 1: XML 文档;Level 2: 根元素: <from>;Level 3: 文本元素: "John";


3、安装
前言:DOM XML 解析器函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。


4、输出XML实例
(1)、XML 文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(2)、加载和输出 XML
前言:初始化 XML 解析器,加载 XML,并把它输出
<?php
// 初始化
$xmlDoc = new DOMDocument();
// 加载
$xmlDoc->load("note.xml");
// 输出_saveXML() 函数把内部 XML 文档放入一个字符串
print $xmlDoc->saveXML();// 结果输出:George John Reminder Don't forget the meeting!;
?>


5、循环XML实例
前言:初始化 XML 解析器,加载 XML,并循环 <note> 元素的所有元素
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");


$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
{
 print $item->nodeName . " = " . $item->nodeValue . "<br />";
}
?>
结果输出:
#text = 
to = George
#text = 
from = John
#text = 
heading = Reminder
#text = 
body = Don't forget the meeting!
#text = 
注释:由上面输出可知,每个元素之间存在空的文本节点。当 XML 生成时,它通常会在节点之间包含空白。XML DOM 解析器把它们当作普通的元素,如果您不注意它们,有时会产生问题。




三、PHP XML SimpleXML
引言:SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展。


1、什么是 SimpleXML?
前言:SimpleXML 是 PHP 5 中的新特性。在了解 XML 文档 layout 的情况下,它是一种取得元素属性和文本的便利途径。
切记:与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从元素中读取文本数据。
注释:SimpleXML 可把 XML 文档转换为对象,比如
元素 - 被转换为 SimpleXMLElement 对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中。
属性 - 通过使用关联数组进行访问,其中的下标对应属性名称。
元素数据 - 来自元素的文本数据被转换为字符串。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。


2、什么时候使用?
前言:当执行类似下列的基础任务时,SimpleXML 使用起来非常快捷
>读取 XML 文件;
>从 XML 字符串中提取数据;
>编辑文本节点或属性;
不过,在处理高级 XML 时,比如命名空间,最好使用 Expat 解析器或 XML DOM。


3、安装
从 PHP 5.0 开始,SimpleXML 函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。


4、使用 SimpleXML
(1)、 XML 文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(2)、输出元素的名称和数据
步骤:
>加载 XML 文件;
>取得根元素的名称;
>使用 children() 函数取得子节点数组;
>输出每个子节点的元素名称和数据;
源码:
<?php
// 加载文件
$xml = simplexml_load_file("test.xml");
// note名称
echo $xml->getName()."<br />";
// 输出note子元素信息
foreach($xml->children() as $child)
{
echo $child->getName().":".$child."<br />";
}
?>




四、PHP XML SimpleXML 参考手册
1、PHP SimpleXML 简介
引言:SimpleXML 函数允许您把 XML 转换为对象。通过普通的<属性选择器>或<数组迭代器>,可以处理这个对象,就像处理任何其他对象一样。注:需要PHP5版本。


2、安装
SimpleXML 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。


3、__construct()函数
说明:创建一个新的 SimpleXMLElement 对象。
(1)、定义
__construct() 函数创建一个新的 SimpleXMLElement 对象。如果成功,则该函数返回一个对象。如果失败,则返回 false。
(2)、语法、参数
语法:__construct(data,options,is_url,ns,is_prefix);
参数:data,必需,形式良好的 XML 字符串或 XML 文档的路径或 URL;options,可选,规定附加的 Libxml 参数;is_url,可选,规定 data 参数是否是 URL,默认是 false;ns,可选;is_prefix,可选;
(3)、实例
<?php
// PHP Version 5.5.9
// phpinfo();
// XML字串
$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<notes>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<note>
<to>tl</to>
<from>cyb</from>
<heading>Reminder43</heading>
<body>Don't forget the meeting!_23</body>
</note>
</notes>
XML;
// SimpleXML
$xml = new SimpleXMLElement($xmlstring);
// 输出
echo $xml->getname().'<br/>'; // notes;
echo $xml->note[1]->to[0]; // tl;
?>


4、addAttribute()函数
说明:给 SimpleXML 元素添加一个属性。该函数无返回值。
(1)、语法
class SimpleXMLElement
{
string addAttribute(name,value,ns)
}
(2)、参数
name 必需。规定属性的名称。
value 必需。规定属性的值。
ns 可选。规定属性的命名空间。
(3)、实例
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->php代码
<?php
// 加载XML
$xml = simplexml_load_file("test.xml");
// 添加属性
$xml->body[0]->addAttribute("type", "small");
// 输出属性
foreach($xml->body[0]->attributes() as $a => $b)
{
 echo $a,'="',$b,'"';
}
// 结果输出
// type="small"
?>


5、addChild()函数
说明:给 SimpleXML 元素添加一个子元素。
定义:addChild() 函数向指定的 XML 节点添加一个子节点。该函数返回一个 SimpleXMLElement 对象,这个对象表示添加到 XML 节点的子元素。
(1)、语法
class SimpleXMLElement
{
string addChild(name,value,ns)
}
(2)、参数
name 必需。规定子元素的名称。
value 必需。规定子元素的值。
ns 可选。规定子元素的命名空间。
(3)、例子
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
<body>别忘记开会!!</body>
</note>
->php代码
<?php
// 加载XML
$xml = simplexml_load_file("note.xml");
// 添加节点
$xml->body[0]->addChild("date", "2008-08-08");
// 输出节点
foreach ($xml->body[0]->children() as $child)
{
echo "Child node: " . $child;
}
// 结果输出
// Child node: 2008-08-08
?>


6、asXML()函数
说明:从 SimpleXML 元素获取 XML 字符串。asXML() 函数以字符串的形式从 SimpleXMLElement 对象返回 XML 文档。若失败,则返回 false。
(1)、语法
class SimpleXMLElement
{
// file参数,可选,如果规定此参数,则该函数会把该XML字串 写入一个文件,而不是返回它。
string asXML(file)
}
(2)、实例
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->php代码
<?php
if (file_exists('test.xml'))
{
$xml = simplexml_load_file('test.xml');
}
echo $xml->asXML();
// 结果输出:George John Reminder Don't forget the meeting!
?>
->页面源码
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>


7、attributes()函数
说明:获取 SimpleXML 元素的属性。该函数提供在一个 XML 标签中定义的属性和值。
(1)、语法
class SimpleXMLElement
{
string attributes(ns,is_prefix)
}
(2)、参数
ns 可选。被检索的属性的命名空间。
is_prefix 可选。默认是 false。
(3)、例子
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body type="small" important="low">Don't forget the meeting!</body>
</note>
->php代码
<?php
$xml = simplexml_load_file("test.xml");
foreach($xml->body[0]->attributes() as $a => $b)
{
echo $a,'="',$b,'"';
}
// 结果输出:type="small" important="low";
?>


7、children()函数
说明:获取指定节点的子节点。
(1)、语法
class SimpleXMLElement
{
string children(ns,is_prefix)
}
(2)、参数
ns 可选。
is_prefix 可选。默认是 false。
(3)、实例
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->php代码
<?php
$xml = simplexml_load_file("test.xml");
foreach ($xml->children() as $child)
{
echo "Child node: " . $child;
}
// 结果输出
/*
Child node: George
Child node: John
Child node: Reminder
Child node: Don't forget the meeting!
*/
?>


8、getDocNamespaces()函数
说明:获取 XML 文档的命名空间。getDocNamespaces() 函数从 SimpleXMLElement 对象返回在 XML 文档中声明的命名空间。如果成功,该函数返回包含命名空间名称(带有关联的 URL)的数组。如果失败,则返回 false。
(1)、语法
class SimpleXMLElement
{
string getDocNamespaces(recursive)
}
(2)、参数
recursive,可选。规定是否返回父子节点中的所有命名空间。默认是 false。
(3)、例子
->XML文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note xmlns:b="http://www.w3school.com.cn/example/">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<b:body>Don't forget the meeting!</b:body>
</note>
->PHP代码
<?php
if (file_exists('test.xml'))
{
$xml = simplexml_load_file('test.xml');
}
print_r($xml->getDocNamespaces());
?>
->结果输出
Array
(
[b] => http://www.w3school.com.cn/example/
)


9、getName()函数
说明:获取 SimpleXML 元素的名称。getName() 函数从 SimpleXMLElement 对象获取 XML 元素的名称。如果成功,该函数返回当前的 XML 元素的名称。如果失败,则返回 false。
(1)、语法
class SimpleXMLElement
{
string getName()
}
(2)、例子
->XML文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->PHP代码
<?php
// 加载XML
if (file_exists('test.xml'))
{
 $xml = simplexml_load_file('test.xml');
}
// 根元素名称
echo $xml->getName();
// 子元素名称
foreach($xml->children() as $child)
{
 echo $child->getName();
}
?>


10、getNamespaces()函数
说明:从 XML 数据获取命名空间。getNamespace() 函数获取在 XML 文档中使用的命名空间。如果成功,该函数返回命名空间(带有关联的 URL)的一个数组。如果失败,则返回 false。
(1)、语法
class SimpleXMLElement
{
string getNamespace(recursive)
}
(2)、参数
recursive,可选。规定是否返回父子节点中使用的所有命名空间。默认是 false。
(3)、实例
->XML文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note xmlns:b="http://www.w3school.com.cn/example/">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<b:body>Don't forget the meeting!</b:body>
</note>
->PHP代码
<?php
if (file_exists('test.xml'))
{
 $xml = simplexml_load_file('test.xml');
}
print_r($xml->getNamespaces());
?>


11、registerXPathNamespace()函数
说明:为下一次 XPath 查询创建命名空间语境。
(1)、语法
class SimpleXMLElement
{
string registerXPathNamespace(prefix,ns)
}
(2)、参数
prefix 必需。规定命名空间前缀。
ns 必需。规定命名空间 URL。必须匹配 XML 文档中的命名空间。
(3)、实例
->XML文件
<?xml version="1.0" encoding="gbk"?>
<note xmlns:b="http://www.w3school.com.cn/example/">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<b:body>Don't forget the meeting!</b:body>
<b:body>不要忘记开会!</b:body>
</note>
->PHP代码
<?php
// 加载XML文件
$xml = simplexml_load_file("test.xml");
// 设置xpath命名空间
$xml->registerXPathNamespace("msg", "http://www.w3school.com.cn/example/");
// 查找body元素
$result = $xml->xpath("msg:body");
// 循环body元素数组
foreach ($result as $message)
{
// //将字符串编码由utf8转变成gbk;
$message = iconv('utf-8', 'gbk', $message);
echo $message.'<br/>';
}
?>
->结果输出
Don't forget the meeting!
不要忘记开会!


12、simplexml_import_dom()函数
说明:从 DOM 节点获取 SimpleXMLElement 对象。simplexml_import_dom() 函数把 DOM 节点转换为 SimpleXMLElement 对象。如果失败,则该函数返回 false。
(1)、语法
simplexml_import_dom(data,class);
(2)、参数
data 必需。规定要使用的 DOM 节点。
class 必需。规定新对象的 class。
(3)实例
->php代码
<?php
$dom = new domDocument;
$dom->loadXML('<note><from>John</from></note>');
$xml = simplexml_import_dom($dom);
echo $xml->from;// 输出:John;
?>


13、simplexml_load_file()函数
说明:从 XML 文档获取 SimpleXMLElement 对象。simplexml_load_file() 函数把 XML 文档载入对象中。如果失败,则返回 false。
(1)、语法
simplexml_load_file(file,class,options,ns,is_prefix);
(2)、参数
file 必需。规定要使用的 XML 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 Libxml 参数。
ns 可选。
is_prefix 可选。
(3)、实例
->xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->php代码
<?php
if (file_exists('test.xml'))
{
$xml = simplexml_load_file('test.xml');
// 倒出变量
var_dump($xml);
}
else
{
exit('Error.');
}
?>
->结果输出
object(SimpleXMLElement)#1 (4)
{
["to"]=> string(4) "George"
["from"]=> string(4) "John"
["heading"]=> string(8) "Reminder"
["body"]=> string(29) "Don't forget the meeting!"
}


14、simplexml_load_string()函数
说明:从 XML 字符串获取 SimpleXMLElement 对象。simplexml_load_string() 函数把 XML 字符串载入对象中。如果失败,则返回 false。
(1)、语法
simplexml_load_file(string,class,options,ns,is_prefix)
(2)、参数
string 必需。规定要使用的 XML 字符串。
class 可选。规定新对象的 class。
options 可选。规定附加的 Libxml 参数。
ns 可选。
is_prefix 可选。
(3)、示例
->php代码
<?php
$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XML;


$xml = simplexml_load_string($xmlstring);


var_dump($xml);
?>
->结果输出
object(SimpleXMLElement)#1 (4)
{
["to"]=> string(4) "George"
["from"]=> string(4) "John"
["heading"]=> string(8) "Reminder"
["body"]=> string(29) "Don't forget the meeting!"
}


15、xpath()函数
说明:对 XML 数据运行 XPath 查询。xpath() 函数运行对 XML 文档的 XPath 查询。如果成功,则返回包含 SimpleXMLElement 对象的一个数组。如果失败,则返回 false。
(1)、语法
class SimpleXMLElement
{
string xpath(path)
}
(2)、参数
path 必需。XPath 路径。
(3)、示例
->XML文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
->PHP代码
<?php
$xml = simplexml_load_file("test.xml");
$result = $xml->xpath("from");
print_r($result);
// echo $result[0];// John;
?>
->结果输出
Array
(
[0] => SimpleXMLElement Object
  (
  [0] => John
  )
)
0 0
原创粉丝点击