欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

php 解析xml 的四种方法(转) PHP XML操作的各种方法解析(比较详细) 有大用

shiping1 的头像

XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument。

1。 XML Expat Parser:

XML Parser使用Expat XML解析器。Expat是一种基于事件的解析器,它把XML文档视为一系列事件。当某个事件发生时,它调用一个指定的函数处理它。Expat是无验证的解析器,忽略任何链接到文档的DTD。但是,如果文档的形式不好,则会以一个错误消息结束。由于它基于事件,且无验证,Expat具有快速并适合web应用程序的特性。

XML Parser的优势是性能好,因为它不是将整个xml文档载入内存后再处理,而是边解析边处理。但也正因为如此,它不适合那些要对xml结构做动态调整、或基于xml上下文结构做复杂操作的需求。如果你只是要解析处理一个结构良好的xml文档,那么它可以很好的完成任务。需要注意的是XML Parser只支持三种编码格式:US-ASCII, ISO-8859-1和UTF-8,如果你的xml数据是其他编码,需要先转换成以上三个之一。
XML Parser常用的解析方式大体有两种(其实就是两个函数):xml_parse_into_struct和xml_set_element_handler。


xml_parse_into_struct

此方法是将xml数据解析到两个数组中:
index数组——包含指向Value 数组中值的位置的指针
value数组——包含来自被解析的 XML 的数据

这俩数组文字描述起来有点麻烦,还是看个例子吧(来自php官方文档)

$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
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
        )
)

其中index数组以标签名为key,对应的值是一个数组,里面包括所有此标签在value数组中的位置。然后通过这个位置,找到此标签对应的值。

如果xml中每组数据格式有出入,不能做到完全统一,那么在写代码时要注意,说不定就得到了错误的结果。比如下面这个例子:

$xml = '
<infos>
<para><note>note1</note><extra>extra1</extra></para>
<para><note>note2</note></para>
<para><note>note3</note><extra>extra3</extra></para>
</infos>
';

$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $values, $tags);
xml_parser_free($p);
$result = array();
//下面的遍历方式有bug隐患
for ($i=0; $i<3; $i++) {
  $result[$i] = array();
  $result[$i]["note"] = $values[$tags["NOTE"][$i]]["value"];
  $result[$i]["extra"] = $values[$tags["EXTRA"][$i]]["value"];
}
print_r($result);

要是按照上面那种方式遍历,看似代码简单,但是暗藏危机,最致命的是得到错误的结果(extra3跑到第二个para里了)。所以要以一种比较严谨的方式遍历:

$result = array();
$paraTagIndexes = $tags['PARA'];
$paraCount = count($paraTagIndexes);
for($i = 0; $i < $paraCount; $i += 2) {
  $para = array();
  //遍历para标签对之间的所有值
  for($j = $paraTagIndexes[$i]; $j < $paraTagIndexes[$i+1]; $j++) {
    $value = $values[$j]['value'];
    if(empty($value)) continue;

    $tagname = strtolower($values[$j]['tag']);
    if(in_array($tagname, array('note','extra'))) {
      $para[$tagname] = $value;
    }
  }
  $result[] = $para;
}

其实我很少用xml_parse_into_struct函数,所以上面所谓“严谨”的代码保不齐还会有其他情况下的bug。- -|
xml_set_element_handler

这种方式是为parser设置处理元素起始、元素终止的回调函数。配套的还有xml_set_character_data_handler用来为parser设置数据的回调函数。这种方式写的代码比较清晰,利于维护。

Example:

$xml = <<<XML
<infos>
<para><note>note1</note><extra>extra1</extra></para>
<para><note>note2</note></para>
<para><note>note3</note><extra>extra3</extra></para>
</infos>
XML;

$result = array();
$index = -1;
$currData;

function charactor($parser, $data) {
  global $currData;
  $currData = $data;
}

function startElement($parser, $name, $attribs) {
  global $result, $index;
  $name = strtolower($name);
  if($name == 'para') {
    $index++;
    $result[$index] = array();
  }
}

function endElement($parser, $name) {
  global $result, $index, $currData;
  $name = strtolower($name);
  if($name == 'note' || $name == 'extra') {
    $result[$index][$name] = $currData;
  }
}

$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "charactor");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!xml_parse($xml_parser, $xml)) {
  echo "Error when parse xml: ";
  echo xml_error_string(xml_get_error_code($xml_parser));
}
xml_parser_free($xml_parser);

print_r($result);

可见,set handler方式虽然代码行数多,但思路清晰,可读性更好,不过性能上略慢于第一种方式,而且灵活性不强。XML Parser支持PHP4,适用于于使用老版本的系统。对于PHP5环境,还是优先考虑下面的方法吧。

2。 SimpleXML

SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed)。它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地说明了函数的作用。三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作。

$string = <<<XML
<?xml version='1.0'?>
<document>
  <cmd>login</cmd>
  <login>imdonkey</login>
</document>
XML;

$xml = simplexml_load_string($string);
print_r($xml);
$login = $xml->login;//这里返回的依然是个SimpleXMLElement对象
print_r($login);
$login = (strval) $xml->login;//在做数据比较时,注意要先强制转换 一定要强制转//换
print_r($login);

SimpleXML的优点是开发简单,缺点是它会将整个xml载入内存后再进行处理,所以在解析超多内容的xml文档时可能会力不从心。如果是读取小文件,而且xml中也不包含namespace,那SimpleXML是很好的选择。

 

3。 XMLReader

XMLReader也是PHP5之后的扩展(5.1后默认安装),它就像游标一样在文档流中移动,并在每个节点处停下来,操作起来很灵活。它提供了对输入的快速和非缓存的流式访问,可以读取流或文档,使用户从中提取数据,并跳过对应用程序没有意义的记录。
以一个利用google天气api获取信息的例子展示下XMLReader的使用,这里也只涉及到一小部分函数,更多还请参考官方文档。

$xml_uri = 'http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';
$current = array();
$forecast = array();

$reader = new XMLReader();
$reader->open($xml_uri, 'gbk');
while ($reader->read()) {
  //get current data
  if ($reader->name == "current_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
    while($reader->read() && $reader->name != "current_conditions") {
      $name = $reader->name;
      $value = $reader->getAttribute('data');
      $current[$name] = $value;
    }
  }

  //get forecast data
  if ($reader->name == "forecast_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
    $sub_forecast = array();
    while($reader->read() && $reader->name != "forecast_conditions") {
      $name = $reader->name;
      $value = $reader->getAttribute('data');
      $sub_forecast[$name] = $value;
    }
    $forecast[] = $sub_forecast;
  }
}
$reader->close();

XMLReader和XML Parser类似,都是边读边操作,较大的差异在于SAX模型是一个“推送”模型,其中分析器将事件推到应用程序,在每次读取新节点时通知应用程序,而使用XmlReader的应用程序可以随意从读取器提取节点,可控性更好。
由于XMLReader基于libxml,所以有些函数要参考文档看看是否适用于你的libxml版本。

4。 DOMDocument

DOMDocument还是PHP5后推出的DOM扩展的一部分,可用来建立或解析html/xml,目前只支持utf-8编码。

$xmlstring = <<<XML
<?xml version='1.0'?>
<document>
  <cmd attr='default'>login</cmd>
  <login>imdonkey</login>
</document>
XML;

$dom = new DOMDocument();
$dom->loadXML($xmlstring);
print_r(getArray($dom->documentElement));

function getArray($node) {
  $array = false;

  if ($node->hasAttributes()) {
    foreach ($node->attributes as $attr) {
      $array[$attr->nodeName] = $attr->nodeValue;
    }
  }

  if ($node->hasChildNodes()) {
    if ($node->childNodes->length == 1) {
      $array[$node->firstChild->nodeName] = getArray($node->firstChild);
    } else {
      foreach ($node->childNodes as $childNode) {
      if ($childNode->nodeType != XML_TEXT_NODE) {
        $array[$childNode->nodeName][] = getArray($childNode);
      }
    }
  }
  } else {
    return $node->nodeValue;
  }
  return $array;
}

从函数名上看感觉跟JavaScript很像,应该是借鉴了一些吧。DOMDocument也是一次性将xml载入内存,所以内存问题同样需要注意。PHP提供了这么多的xml处理方式,开发人员在选择上就要花些时间了解,选择适合项目需求及系统环境、又便于维护的方法。

转 

http://www.phpzh.com/archives/525/2

来自 http://www.cnblogs.com/likwo/archive/2011/08/24/2151793.html


PHP XML操作的各种方法解析(比较详细)

作者: 字体:[增加 减小] 类型:转载
PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序。本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍。

XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。在实际应用中,一些简单的、安全性较低的数据往往使用 XML文件的格式进行存储。这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度。 
PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序。本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍。 
1 XML简介 
XML是“可扩展性标识语言(eXtensible Markup Language)”的缩写,是一种类似于 HTML的标记性语言。但是与 HTML不同,XML主要用于描述数据和存放数据,而 HTML主要用于显示数据。 
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 XML代码可以用来描述一条留言。 

复制代码代码如下:

<thread> 
<title>Welcome</title> 
<author>Simon</author> 
<content>Welcome to XML guestbook!!</content> 
</thread> 

其中,<thread>与</thread>标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。 
在一个 XML文件的顶部,通常使用<?xml version=”1.0″?>来标识 XML数据的开始和 XML数据使用标准的版本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。
本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。 
 
XML的发展非常迅速,近些年来很多软件开发商都开始采用 XML的开发标准进行应用程序的开发。并且,很多新兴技术都架构在 XML数据之上。这意味着 XML将与 HTML一样成为 Web技术不可或缺的一部分。 
2 简单的 XML操作 
在实际应用中,PHP与 XML的交互操作应用非常广泛。SimpleXML组件是 PHP5新增加的一个简 
单的 XML操作组件,与传统的 XML组件相比,SimpleXML组件的使用非常简单。本节将对使用 
SimpleXML组件操作 XML的方法做一下详细介绍。 
2.1 创建一个 SimpleXML对象 
SimpleXML对象是用来临时存储 XML数据的临时变量,对 XML进行的操作都是通过操作 SimpleXML对象来完成的。SimpleXML组件提供了两种创建 SimpleXML对象的方法。第一种方法是使用 simplexml_load_string函数读取一个字符串型变量中的 XML数据来完成创建的,其语法格式如下所示。 
simplexml_load_string(string data) 
这里的 data变量用于存储 XML数据。以下代码使用 simplexml_load_string函数创建了一个 SimpleXML对象 
复制代码代码如下:

<?php 
$data = <<<XML //定义 XML数据 
<?xml version='1.0′?> 
<departs> 
<depart> 
<name>production support</name> 
<employees> 
<employee> 
<serial_no>100001</serial_no> 
<name>Simon</name> 
<age>24</age> 
<birthday>1982-11-06</birthday> 
<salary>5000.00</salary> 
<bonus>1000.00</bonus> 
</employee> 
<employee> 
<serial_no>100002</serial_no> 
<name>Elaine</name> 
<age>24</age> 
<birthday>1982-01-01</birthday> 
<salary>6000.00</salary> 
<bonus>2000.00</bonus> 
</employee> 
</employees> 
</depart> 
<depart> 
<name>testing center</name> 
<employees> 
<employee> 
<serial_no>110001</serial_no> 
<name>Helen</name> 
<age>23</age> 
<birthday>1983-07-21</birthday> 
<salary>5000.00</salary> 
<bonus>1000.00</bonus> 
</employee> 
</employees> 
</depart> 
</departs> 
XML; 
$xml = simplexml_load_string($data); //创建 SimpleXML对象 
print_r($xml); //输出 XML 
?> 

在上面的例子中,$data变量存储了一段 XML数据。 simplexml_load_string函数将变量$data转化成 SimpleXML对象。通过 print_r函数的输出可以看出该对象的结构,运行结果如下所示。 
复制代码代码如下:

SimpleXMLElement Object 
( 
[depart] => Array 
( 
[0] => SimpleXMLElement Object 
( 
[name] => production support 
[employees] => SimpleXMLElement Object 
( [employee] => Array ( 
[0] => SimpleXMLElement Object 
( [serial_no] => 100001 
[name] => Simon 
[age] => 24 
[birthday] => 1982-11-06 
[salary] => 5000.00 
[bonus] => 1000.00 
) 
[1] => SimpleXMLElement Object 
( [serial_no] => 100002 
[name] => Elaine 
[age] => 24 
[birthday] => 1982-01-01 
[salary] => 6000.00 
[bonus] => 2000.00 
) 
) 
) 
) 
[1] => SimpleXMLElement Object 
( 
[name] => testing center 
[employees] => SimpleXMLElement Object 
( 
[employee] => SimpleXMLElement Object 
( 
[serial_no] => 110001 
[name] => Helen 
[age] => 23 
[birthday] => 1983-07-21 
[salary] => 5000.00 
[bonus] => 1000.00 
) 
) 
) 
) 
) 

从输出结果可以看出,SimpleXML对象的结构与 XML数据的格式完全相同。 
第二种方法是使用 simplexml_load_flie函数读取一个 XML文件来完成创建的,其语法格式如下所示。 
simplexml_load_file(string filename) 
这里的 filename变量是用于存储 XML数据文件的文件名及其所在路径。以下代码使用 simplexml_load_file函数来创建了一个 SimpleXML对象。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //创建 SimpleXML对象 
print_r($xml); //输出 XML 
?> 

其中,example.xml存储的数据与上面的$data完全相同,运行结果也与上面完全相同。 
上面两种方法实现了同样的功能,其区别就在于 XML的数据源不同。如果 XML的数据源在 PHP脚本文件中,则需要使用 simplexml_load_string来进行创建。如果 XML的数据源在一个单独的 XML文件中,则需要使用 simplexml_load_file来进行创建。 
2.2 读取 SimpleXML对象中的 XML数据 
前面介绍了使用 print_r函数来读取 SimpleXML对象中的数据,其返回结果与数组的结构类似。显然,这种显示方式在实际应用中是不可取的。在这里将介绍其他的几种读取 SimpleXML对象中 XML数据的方法。 
1.var_dump函数显示对象详细信息 
var_dump函数可以用于显示 SimpleXML对象的详细信息,与 print_r函数相比,var_dump函数显示的信息更为完整,其语法如下所示。 
void var_dump(object1, object2 … ) 
以下代码使用 var_dump函数输出了上面例子中对象的详细信息。 
复制代码代码如下:

<?php $xml = simplexml_load_file('example.xml'); //创建 SimpleXML对象 var_dump($xml); //输出 XML ?> 

运行结果如下所示。 
复制代码代码如下:

object(SimpleXMLElement)#1 (1) { ["depart"]=> array(2) { 
[0]=> 
object(SimpleXMLElement)#2 (2) { 
["name"]=> 
string(18) “production support” 
["employees"]=> 
object(SimpleXMLElement)#4 (1) { 
["employee"]=> 
array(2) { 
[0]=> 
object(SimpleXMLElement)#5 (6) { 
["serial_no"]=> 
string(6) “100001″ 
["name"]=> 
string(5) “Simon” 
["age"]=> 
string(2) “24″ 
["birthday"]=> 
string(10) “1982-11-06″ 
["salary"]=> 
string(7) “5000.00″ 
["bonus"]=> 
string(7) “1000.00″ 
} 
[1]=> 
object(SimpleXMLElement)#6 (6) { 
["serial_no"]=> 
string(6) “100002″ 
["name"]=> 
string(6) “Elaine” 
["age"]=> 
string(2) “24″ 
["birthday"]=> 
string(10) “1982-01-01″ 
["salary"]=> 
string(7) “6000.00″ 
["bonus"]=> 
string(7) “2000.00″ 
} 
} 
} 
} 
[1]=> 
object(SimpleXMLElement)#3 (2) { 
["name"]=> 
string(14) “testing center” 
["employees"]=> 
object(SimpleXMLElement)#7 (1) { 
["employee"]=> 
object(SimpleXMLElement)#8 (6) { 
["serial_no"]=> 
string(6) “110001″ 
["name"]=> 
string(5) “Helen” 
["age"]=> 
string(2) “23″ 
["birthday"]=> 
string(10) “1983-07-21″ 
["salary"]=> 
string(7) “5000.00″ 
["bonus"]=> 
string(7) “1000.00″ 
}}}}} 

与前面 print_r输出的结果相比较,var_dump函数的输出结果的结构更为严谨,并且将对象中的每一个属性的数据类型均作出分析。在实际应用中,var_dump函数往往用于程序调试时的对象检测。 
2.读取 XML数据中的标签 
与操作数组类型的变量类似,读取 XML也可以通过类似的方法来完成。例如,如果需要读取上面 XML数据中每一个“ depart”标签下的“name”属性,可以通过使用 foreach函数来完成,如以下代码 
所示。 
复制代码代码如下:

<?php $xml = simplexml_load_file('example.xml'); foreach($xml->depart as $a) 
{ 
echo “$a->name <BR>”; 
} 
?> 

运行结果如下所示。 
production support 
testing center 
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签 
//输出其中的 name属性 
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //读取 XML文件 
echo $xml->depart->name[0]; //输出节点 
?> 

运行结果如下所示。 
production support 
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); 
foreach ($xml->depart->children() as $depart) //循环读取 depart标签下的子标签 
{ 
var_dump($depart); //输出标签的 XML数据 
} 
?> 

运行结果如下所示。 
复制代码代码如下:

object(SimpleXMLElement)#3 (1) { 
[0]=> 
string(18) “production support” 
} 
object(SimpleXMLElement)#5 (1) { 
["employee"]=> 
array(2) { 
[0]=> 
object(SimpleXMLElement)#3 (6) { 
["serial_no"]=> 
string(6) “100001″ 
["name"]=> 
string(5) “Simon” 
["age"]=> 
string(2) “24″ 
["birthday"]=> 
string(10) “1982-11-06″ 
["salary"]=> 
string(7) “5000.00″ 
["bonus"]=> 
string(7) “1000.00″ 
} 
[1]=> 
object(SimpleXMLElement)#6 (6) { 
["serial_no"]=> 
string(6) “100002″ 
["name"]=> 
string(6) “Elaine” 
["age"]=> 
string(2) “24″ 
["birthday"]=> 
string(10) “1982-01-01″ 
["salary"]=> 
string(7) “6000.00″ 
["bonus"]=> 
string(7) “2000.00″ 
} 
} 
} 

可以看出,使用 children方法后,所有的子标签均被当作一个新的 XML文件进行处理。 
3.基于 XML数据路径的查询 
SimpleXML组件提供了一种基于 XML数据路径的查询方法。 XML数据路径即从 XML的根到某一个标签所经过的全部标签。这种路径使用斜线“ /”隔开标签名。例如,对于上面的 XML数据,要查询所有的标签“name”中的值,从根开始要经过 departs、depart、employees和 employee标签,则其路径 
为“/departs/depart/employees/employee/name”。 SimpleXML组件使用 xpath方法来解析路径,其语法格式如下所示。 
xpath(string path) 
其中的 path为路径。该方法返回了一个包含有所有要查询标签值的数组。以下代码查询了上面 XML数据中的所有 name标签。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //读取 XML文件 
$result = $xml->xpath('/departs/depart/employees/employee/name'); //定义节点 
var_dump($result); //输出节点 
?> 

运行结果如下所示。 
复制代码代码如下:

array(3) { 
[0]=> object(SimpleXMLElement)#2 (1) { 
[0]=> string(5) “Simon” 
} 
[1]=> object(SimpleXMLElement)#3 (1) { 
[0]=> string(6) “Elaine” 
} 
[2]=> object(SimpleXMLElement)#4 (1) { 
[0]=> string(5) “Helen” 
} 
} 

可以看出,所有的 name标签均被查询出来。 
2.3 XML数据的修改 
对于 XML数据的修改与读取 XML数据中的标签方法类似。即通过直接修改 SimpleXML对象中的标签的值来实现。以下代码实现了对上面 XML数据中第一个“ depart”标签的“ name”子标签的修改。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //读取 XML 
$xml->depart->name[0] = “Human Resource”; //修改节点 
?> 

修改后,并不会对 XML文件有任何影响。但是,在程序中,对于 SimpleXML对象的读取将使用修改过的值。 
2.4 标准化 XML数据 
SimpleXML还提供了一种标准化 XML数据的方法 asXML。asXML方法可以有效的将 SimpleXML对象中的内容按照 XML 1.0标准进行重新编排并以字符串的数据类型返回。以下代码实现了对上面 XML数据的标准化。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //读取 XML数据 
echo $xml->asXML(); //标准化 XML数据 
?> 

2.5 XML数据的存储 
将 SimpleXML对象中的 XML数据存储到一个 XML文件的方法非常简单,即将 asXML方法的返回结果输出到一个文件中即可。以下代码首先将 XML文件中的 depart name进行了修改,然后将修改过的 XML数据输出到另一个 XML文件。 
复制代码代码如下:

<?php 
$xml = simplexml_load_file('example.xml'); //读取 XML数据 
$newxml = $xml->asXML(); //标准化 XML数据 
$fp = fopen(”newxml.xml”, “w”); //打开要写入 XML数据的文件 
fwrite($fp, $newxml); //写入 XML数据 
fclose($fp); //关闭文件 
?> 

代码运行后,可以看到在 newxml.xml文件中的 XML数据如下所示。 
可以看出,对于 XML文件的修改已经保存到输出文件中了。 
3 XML文档的动态创建 
在实际应用中,时而会需要动态生成 XML文档的操作。前面介绍的 SimpleXML组件并不提供创建 XML文档的方法。因此,如果需要动态创建 XML文档,往往使用 DOM组件进行创建。 DOM是文档对象模型 Document Object Model的缩写, DOM组件提供了对 XML文档的树型解析模式。以下代码使用 DOM组件创建了一个 XML文档。 

复制代码代码如下:

<?php 
//创建一个新的 DOM文档 
$dom = new DomDocument(); 
//在根节点创建 departs标签 
$departs = $dom->createElement('departs'); 
$dom->appendChild($departs); 
//在 departs标签下创建 depart子标签 
$depart = $dom->createElement('depart'); 
$departs->appendChild($depart); 
//在 depart标签下创建 employees子标签 
$employees = $dom->createElement('employees'); 
$depart->appendChild($employees); 
//在 employees标签下创建 employee子标签 
$employee = $dom->createElement('employee'); 
$employees->appendChild($employee); 
//在 employee标签下创建 serial_no子标签 
$serial_no = $dom->createElement('serial_no'); 
$employee->appendChild($serial_no); 
//为 serial_no标签添加值节点 100001 
$serial_no_value = $dom->createTextNode('100001′); 
$serial_no->appendChild($serial_no_value); 
//输出 XML数据 
echo $dom->saveXML(); 
?> 
输出结果如下所示。 
<?xml version=”1.0″?> 
<departs> 
<depart> 
<employees> 
<employee> 
<serial_no>100001</serial_no> 
</employee> 
</employees> 
</depart> 
</departs> 

DOM组件除了可以用来动态创建 XML文档外,还可以用来读取 XML文件。以下代码实现了对前 
面 XML文件的读取。 
复制代码代码如下:

<?php 
$dom = new DomDocument(); //创建 DOM对象 
$dom->load('example.xml'); //读取 XML文件 
$root = $dom->documentElement; //获取 XML数据的根 
read_child($root); //调用 read_child函数读取根对象 
function read_child($node) 
{ 
$children = $node->childNodes; //获得$node的所有子节点 
foreach($children as $e) //循环读取每一个子节点 
{ 
if($e->nodeType == XML_TEXT_NODE) //如果子节点为文本型则输出 
{ 
echo $e->nodeValue.”<BR>”; 
} 
else if($e->nodeType == XML_ELEMENT_NODE) //如果子节点为节点对象,则调用函数处理 
{ 
read_child($e); 
} 
} 
} 
?> 

运行结果如下所示。 
复制代码代码如下:

引用 
production support 
100001 
Simon 
24 
1982-11-06 
5000.00 
1000.00 
100002 
Elaine 
24 
1982-01-01 
6000.00 
2000.00 
testing center 
110001 
Helen 
23 
1983-07-21 
5000.00 
1000.00 

上面的例子使用了递归的方式对 XML数据进行了处理,实现了输出 XML数据中的所有文本型标签的功能。 
4 XML应用实例——留言本 
前面介绍了 XML的基本操作,本节将以设计一个 XML留言本为例来详细说明在实际应用中如何实现 PHP与 XML数据的交互操作。 
4.1 XML文件结构设计 
XML文件用于存储 XML数据,也就是留言本中的留言。这里,对于每条留言,在 XML数据中主要包括三项内容:留言标题、留言者姓名、留言内容。因此,将 XML文件的格式设计如下。 

复制代码代码如下:

<?xml version=”1.0″?> 
<threads> 
<thread> 
<title>这里是留言的标题</title> 
<author>这里是留言者</author> 
<content>这里是留言内容</content> 
</thread> 
</threads> 

4.2 提交页面的编写 
提交留言页面由两个页面组成。一个是让访问者用来书写留言的表单的 HTML文件,一个是用来处理访问者输入的 PHP脚本。表单的 HTML代码如下所示。 
复制代码代码如下:

<html> 
<head> 
<title>发表新的留言</title> 
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 
</head> 
<body> 
<H1><p align=”center”>发表新的留言</p></H1> 
<form name=”form1″ method=”post” action=”Post.php”> 
<table width=”500″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> 
<tr> 
<td>标题</td> 
<td><input name=”title” type=”text” id=”title” size=”50″></td> 
</tr> 
<tr> 
<td>作者</td> 
<td><input name=”author” type=”text” id=”author” size=”20″></td> 
</tr> 
<tr> 
<td>内容</td> 
<td><textarea name=”content” cols=”50″ rows=”10″ id=”content”></textarea></td> 
</tr> 
</table> 
<p align=”center”> 
<input type=”submit” value=”Submit”> 
<input type=”reset” value=”Reset”> 
</p> 
</form> 
</body> 
</html> 

对于用来处理用户输入的 PHP脚本,其基本逻辑是首先创建一个 DOM对象,然后读取 XML文件中的 XML数据,接下来在 XML对象上创建新的节点并将用户的输入储存起来,最后将 XML数据输出到原来的 XML文件中。具体实现代码如下所示。 
复制代码代码如下:

<?php 
$guestbook = new DomDocument(); //创建一个新的 DOM对象 
$guestbook->load('DB/guestbook.xml'); //读取 XML数据 
$threads = $guestbook->documentElement; //获得 XML结构的根 
//创建一个新 thread节点 
$thread = $guestbook->createElement('thread'); 
$threads->appendChild($thread); 
//在新的 thread节点上创建 title标签 
$title = $guestbook->createElement('title'); 
$title->appendChild($guestbook->createTextNode($_POST['title'])); 
$thread->appendChild($title); 
//在新的 thread节点上创建 author标签 
$author = $guestbook->createElement('author'); 
$author->appendChild($guestbook->createTextNode($_POST['author'])); 
$thread->appendChild($author); 
//在新的 thread节点上创建 content标签 
$content = $guestbook->createElement('content'); 
$content->appendChild($guestbook->createTextNode($_POST['content'])); 
$thread->appendChild($content); 
//将 XML数据写入文件 
$fp = fopen(”DB/guestbook.xml”, “w”); 
if(fwrite($fp, $guestbook->saveXML())) 
echo “留言提交成功”; 
else 
echo “留言提交失败”; 
fclose($fp); 
?> 

在浏览器中运行上述 HTML文件并填写适当的留言内容,如图 2所示。 
 
图 2 发表新留言界面 
单击【Submit】按钮后,XML文件中的内容如下所示。 
可以看到 XML文件中已经将留言存储起来了。 
4.3 显示页面的编写
4.3 显示页面的编写 
显示页面可以使用前面介绍的 SimpleXML组件很容易的实现,具体实现代码如下所示。 
复制代码代码如下:

<?php 
//打开用于存储留言的 XML文件 
$guestbook = simplexml_load_file('DB/guestbook.xml'); 
foreach($guestbook->thread as $th) //循环读取 XML数据中的每一个 thread标签 
{ 
echo “<B>标题:</B>”.$th->title.”<BR>”; 
echo “<B>作者:</B>”.$th->author.”<BR>”; 
echo “<B>内容:</B><PRE>”.$th->content.”</PRE>”; 
echo “<HR>”; 
} 
?> 
 

在浏览器中查看运行结果如图 3所示。 


来自 http://www.jb51.net/article/23912.htm

普通分类: