1 XML
- 什么是 XML?
可扩展标记语言。
一种被设计用来传输和存储数据的语言,其焦点是数据的内容。
设计宗旨是传输数据,而不是显示数据,与html不同。 - XML用来干嘛?
XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。
但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。 - 总结
一个方便传输数据的格式 - 一个实例
XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。
在 XML 中,没有预定义的标签。必须定义自己的标签。
上图表示下面的 XML 中的一本书,这样的书有三本:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
2 php处理XML
如需读取和更新 - 创建和处理 - 一个 XML 文档,则需要 XML 解析器。
PHP内置了两个XML解析器:Expat和DOM,和一个处理XML函数:SimpleXML
有两种基本的 XML 解析器类型:
- 基于树的解析器:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供了对树中元素的访问,例如文档对象模型 (DOM)。DOM 解析器是基于树的解析器。
- 基于事件的解析器:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。Expat 解析器是基于事件的解析器。
与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。
当执行类似下列的基础任务时,SimpleXML 使用起来非常快捷:
- 读取/提取 XML 文件/字符串的数据
- 编辑文本节点或属性
然而,在处理高级 XML 时,比如命名空间,最好使用 Expat 解析器或 XML DOM。
2.1 Expat 解析器
- Expat 是什么?
Expat 解析器是基于事件的解析器。PHP内置。
基于事件的解析器集中在 XML 文档的内容,而不是它们的结构。正因为如此,基于事件的解析器能够比基于树的解析器更快地访问数据。
<from>Jani</from>
基于事件的解析器把上面的 XML 报告为一连串的三个事件:
- 开始元素:from
- 开始 CDATA 部分,值:Jani
- 关闭元素:from
上面的 XML 实例包含了格式良好的 XML。不过这个实例是无效的 XML,因为没有与它关联的文档类型声明 (DTD)。比如
<?xml version="1.0" encoding="utf-8"?>
然而,在使用 Expat 解析器时,这没有区别。Expat 是不检查有效性的解析器,忽略任何 DTD。
- 实例
- 用在实例的XML 文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don\'t forget me this weekend!</body>
</note>
- 初始化解析器并解析XML文件
要在 PHP 中初始化 XML 解析器,为不同的 XML 事件定义处理器,然后解析这个 XML 文件。
<?php
//初始化 XML 解析器
$parser=xml_parser_create();
//Function to use at the start of an element
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 to use at the end of an element
function stop($parser,$element_name)
{
echo "<br>";
}
//Function to use when finding character data
function char($parser,$data)
{
echo $data;
}
//Specify element handler
xml_set_element_handler($parser,"start","stop");
//Specify data handler
xml_set_character_data_handler($parser,"char");
//Open XML file
$fp=fopen("test.xml","r");
//Read data
while ($data=fread($fp,4096))
{
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)));
}
//Free the XML parser
xml_parser_free($parser);
?>
以上代码将输出:
工作原理:
2.2 DOM 解析器
- DOM 是什么?
- DOM 解析器
DOM 解析器是基于树的解析器。PHP内置。
<?xml version="1.0" encoding="ISO-8859-1"?>
<from>Jani</from>
XML DOM 把上面的 XML 视为一个树形结构:
- Level 1: XML 文档
- Level 2: 根元素:
- Level 3: 文本元素: "Jani"
- 实例
- 使用的XML
- 加载和输出 XML
需要初始化 XML 解析器,加载 XML,并把它输出:
以上代码将输出:
如果在浏览器窗口中查看源代码,会看到下面的 HTML:
上面的实例创建了一个 DOMDocument-Object,并把 "note.xml" 中的 XML 载入这个文档对象中。
saveXML() 函数把内部 XML 文档放入一个字符串,这样我们就可以输出它。 - 遍历 XML
初始化 XML 解析器,加载 XML,并遍历元素的所有元素:
在上面的实例中,可以看到了每个元素之间存在空的文本节点。
当 XML 生成时,它通常会在节点之间包含空白。XML DOM 解析器把它们当作普通的元素,如果不注意它们,有时会产生问题。
2.3 SimpleXML 函数
- 什么是 PHP SimpleXML?
SimpleXML 是 PHP 5 中的新特性。内置。
SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。
SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如:
- 元素被转换为 SimpleXMLElement 对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中。
- 属性通过使用关联数组进行访问,其中的索引对应属性名称。
- 元素内部的文本被转换为字符串。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。
- 实例
- XML文件 note.xml
- 输出 $xml 变量(是 SimpleXMLElement 对象)的键和元素
输出:
- 输出 XML 文件中每个元素的数据
输出:
- 输出每个子节点的元素名称和数据
输出: