PHP - 简单 XML 解析器


PHP 的 SimpleXML 扩展提供了一个非常简单易用的工具集,用于将 XML 转换为可以使用普通属性选择器和数组迭代器进行处理的对象。它是一个 tree_based 解析器,可以很好地处理简单的 XML 文件,但在处理更大和更复杂的 XML 文档时可能会遇到问题。

以下函数在 SimpleXML 扩展中定义 -

simplexml_load_file

simplexml_load_file() 函数将 XML 文件解释为对象 -


simplexml_load_file(
   string $filename,
   ?string $class_name = SimpleXMLElement::class,
   int $options = 0,
   string $namespace_or_prefix = "",
   bool $is_prefix = false
): SimpleXMLElement|false

给定文件中格式正确的 XML 文档将转换为对象。

filename 参数是一个字符串,表示要解析的 XML 文件。class_name 是可选参数。它指定函数将返回其对象的类。该函数返回一个类 SimpleXMLElement 的对象,其属性包含 XML 文档中保存的数据,如果失败,则返回 false

例子

请看下面的例子 -


<?php
   $xml = simplexml_load_file("test.xml") or die("错误:无法创建对象");
   print_r($xml);
?>

它将产生以下输出 -

SimpleXMLElement Object
(
   [Course] => Android
   [Subject] => Android
   [Company] => qikepu
   [Price] => $10
)

simplexml_load_string() 函数将 XML 文件解释为对象。


simplexml_load_string(
   string $filename,
   ?string $class_name = SimpleXMLElement::class,
   int $options = 0,
   string $namespace_or_prefix = "",
   bool $is_prefix = false
): SimpleXMLElement|false

给定字符串中格式正确的 XML 文档将转换为对象。

$data 参数是一个字符串,表示要解析的 XML 文档。class_name 是可选参数。它指定函数将返回其对象的类。该函数返回一个类 SimpleXMLElement 的对象,其属性包含 XML 文档中保存的数据,如果失败,则返回 false

例子

请看下面的例子 -


<?php
   $data = "<?xml version = '1.0' encoding = 'UTF-8'?>   
   <note>
      <Course>Android</Course>
      <Subject>Android</Subject>
      <Company>qikepu</Company>
      <Price>$10</Price>
   </note>";
   $xml = simplexml_load_string($data) or die("错误:无法创建对象");
   print_r($xml);
?>

它将产生以下输出 -

SimpleXMLElement Object
(
   [Course] => Android
   [Subject] => Android
   [Company] => qikepu
   [Price] => $10
)

simplexml_import_dom

simplexml_import_dom() 函数从 DOM 节点构造 SimpleXMLElement 对象。


simplexml_import_dom(SimpleXMLElement|DOMNode $node, ?string 
   $class_name = SimpleXMLElement::class): ?SimpleXMLElement

此函数获取 DOM 文档的一个节点,并将其转换为 SimpleXML 节点。然后,可以将此新对象用作本机 SimpleXML 元素。

node 参数是 DOM 元素节点。可以给出可选的 class_name,以便 simplexml_import_dom() 将返回 SimpleXMLElement 类的指定子类的对象。此函数返回的值是 SimpleXMLElement 或 失败时为 null

例子

请看下面的例子 -


<?php
   $dom = new DOMDocument;
   $dom->loadXML('<books><book><title>PHP 手册</title></book></books>');
   if (!$dom) {
      echo '解析文档时出错';
      exit;
   }

   $s = simplexml_import_dom($dom);
   echo $s->book[0]->title;
?>

它将产生以下输出 -

PHP 手册

获取 Node 值

以下代码显示从 XML 文件获取节点值,XML 应如下所示 -


<?xml version = "1.0" encoding = "utf-8"?>
<qikepu>
   <course category = "JAVA">
      <title lang = "zh-cn">Java</title>
      <tutor>Gopal</tutor>
      <duration></duration>
      <price>$30</price>
   </course>

   <course category = "HADOOP">
      <title lang = "zh-cn">Hadoop</title>.
      <tutor>Satish</tutor>
      <duration>3</duration>
      <price>$50</price>
   </course>

   <course category = "HTML">
      <title lang = "zh-cn">html</title>
      <tutor>raju</tutor>
      <duration>5</duration>
      <price>$50</price>
   </course>

   <course category = "WEB">
      <title lang = "zh-cn">Web Technologies</title>
      <tutor>Javed</tutor>
      <duration>10</duration>
      <price>$60</price>
   </course>
</qikepu>

例子

PHP 代码应如下所示 -


<?php
   $xml = simplexml_load_file("books.xml") or die("错误:无法创建对象");

   foreach($xml->children() as $books) { 
      echo $books->title . "<br> "; 
      echo $books->tutor . "<br> "; 
      echo $books->duration . "<br> ";
      echo $books->price . "<hr>"; 
   }
?>

它将产生以下输出 -

Java
Gopal

$30
________________________________________
Hadoop
Satish
3
$50
________________________________________
html
raju
5
$50
________________________________________
Web Technologies
Javed
10
$60
________________________________________