PHP-XML

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 解析器

  1. 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。

  1. 实例
  2. 用在实例的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>
  1. 初始化解析器并解析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 解析器

  1. DOM 是什么?
  2. 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"
  1. 实例
  2. 使用的XML
  3. 加载和输出 XML
    需要初始化 XML 解析器,加载 XML,并把它输出:

    以上代码将输出:

    如果在浏览器窗口中查看源代码,会看到下面的 HTML:

    上面的实例创建了一个 DOMDocument-Object,并把 "note.xml" 中的 XML 载入这个文档对象中。
    saveXML() 函数把内部 XML 文档放入一个字符串,这样我们就可以输出它。
  4. 遍历 XML
    初始化 XML 解析器,加载 XML,并遍历 元素的所有元素:

在上面的实例中,可以看到了每个元素之间存在空的文本节点。
当 XML 生成时,它通常会在节点之间包含空白。XML DOM 解析器把它们当作普通的元素,如果不注意它们,有时会产生问题。

2.3 SimpleXML 函数

  1. 什么是 PHP SimpleXML?
    SimpleXML 是 PHP 5 中的新特性。内置。
    SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。
    SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如:
  • 元素被转换为 SimpleXMLElement 对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中。
  • 属性通过使用关联数组进行访问,其中的索引对应属性名称。
  • 元素内部的文本被转换为字符串。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。
  1. 实例
  2. XML文件 note.xml
  3. 输出 $xml 变量(是 SimpleXMLElement 对象)的键和元素

    输出:
  4. 输出 XML 文件中每个元素的数据

    输出:
  5. 输出每个子节点的元素名称和数据

    输出:
posted @ 2020-07-16 18:56  雨九九  阅读(257)  评论(0编辑  收藏  举报