--enable-xml_15分钟PHP-with-XML入门

--enable-xml

很难忘记XML在当今应用程序开发环境中的重要性。 如果您以前从未在PHP中使用XML或尚未过渡到PHP5,那么本入门指南如何使用PHP5中针对XML的新功能进行操作,可能会说服您使用XML多么容易。 这个由三部分组成的系列文章中的第一篇文章重点介绍了快速入门API,它演示了SimpleXML(在必要时与DOM结合使用)如何成为处理直接,可预测且相对较小的XML文档的开发人员的理想选择。 这些文档正是Ajax应用程序通过的排序,例如包含表单提交的内容或Web服务应用程序编程接口(API)(如weather.com)的响应。

XML基础

有关XML的一些背景知识将使您了解其对PHP开发人员的重要性,并使您了解和创建简单的XML文档。

关于XML

可扩展标记语言(XML)被描述为标记语言和基于文本的数据存储格式,具体取决于您与谁交谈。 它是标准通用标记语言(SGML)的子集; 它提供了一种基于文本的方法,可以对信息应用和描述基于树的结构。 XML是多种语言/格式的基础,例如,真正简单的联合组织(RSS),Mozilla的XML用户界面语言(XUL),Macromedia的最大体验标记语言(MXML),Microsoft的可扩展应用标记语言(XAML)和开源Java XML UI标记语言(XAMJ)。 正如XML的多种风格所表明的那样,XML至关重要。 每个人都希望加入XML潮流。

编写XML

XML是数据的基本单位。 元素由开始标签(例如<book>)和结束标签(例如</ book>)定界。 如果有开始标签,则必须有结束标签。 如果您没有为每个开始标记都包含结束标记,则您的XML文档格式不正确,解析器将无法正确解析该文档。 标签通常被命名以反映元素中包含的内容的类型。 您会期望一个名为book的元素包含一个书名,例如Great American Novel(请参见清单1)。 标签之间的内容(包括空白)被称为字符数据。

清单1.一个样本XML文档
<books>
  <book>
   <title>Great American Novel</title>
   <characters>
    <character>
     <name>Cliff</name>
     <desc>really great guy</desc>
    </character>
    <character>
     <name>Lovely Woman</name>
     <desc>matchless beauty</desc>
    </character>
    <character>
     <name>Loyal Dog</name>
     <desc>sleepy</desc>
    </character>
   </characters>
   <plot>
    Cliff meets Lovely Woman.  Loyal Dog sleeps, but wakes up to bark
    at mailman.
   </plot>
   <success type="bestseller">4</success>
   <success type="bookclubs">9</success>
   </book>
  </books>

XML元素和属性名称可以由大写字母AZ,小写字母az,数字0-9,某些特殊和非英语字符以及三个标点符号,连字符,下划线和句点组成。 名称中不允许使用其他标点符号。

XML区分大小写。 在此示例中,<Book>和<book>描述了两个不同的元素。 任一个都是可接受的元素名称。 使用<Book>和<book>来描述两个不同的元素可能不是一个好主意,因为文书错误的可能性似乎很高。

每个XML文档仅包含一个根元素。 根元素是XML文档中唯一没有父元素的元素。 在上面的示例中,根元素是<books>。 大多数XML文档都包含父元素和子元素。 <books>元素有一个子元素<book>。 <book>元素有四个子元素,分别为<title>,<characters>,<plot>和<success>。 <characters>元素具有三个子元素,每个子元素都是一个<character>元素。 每个<character>元素都有两个子元素<name>和<desc>。

除了嵌套创建父子关系的元素外,XML元素还可以具有属性。 属性是附加到元素的开始标签的名称/值对。 名称与值之间用等号=分隔。 值用单引号或双引号引起来。 在上面的清单1中,<success>元素具有两个属性“ bestseller”和“ bookclubs”。 在XML开发人员中,关于属性的使用存在不同的思想流派。 属性中包含的大多数信息都可以包含在子元素中。 一些开发人员坚持认为属性信息应该是元数据,即有关数据的信息,而不是数据本身。 数据本身应包含在元素中。 是否使用属性的选择实际上取决于数据的性质以及如何从XML提取数据。

XML的优势

XML的优良品质之一是其相对简单。 您可以使用基本的文本编辑器和文字处理器来编写XML,而无需特殊的工具或软件。 XML的基本语法由嵌套元素组成,其中一些元素具有属性和内容。 一个元素通常由两个标签组成,一个开始标签和一个结束标签,每个标签都由一个打开的<tag>和一个关闭的</ tag>括起来。 XML区分大小写,并且不会忽略空格。 它看起来很像HTML,很多人都很熟悉,但是与HTML不同,它允许您命名标签以最好地描述数据。 XML的一些优点是它的自记录,人工和机器可读格式,对Unicode的支持(它允许对人类语言的支持进行国际化)以及其严格的语法和解析要求。 不幸的是,UTF-8在PHP5中是有问题的。 这个缺点是驱动PHP6开发的动力之一。

XML的弱点

XML冗长且冗长,随之而来的后果是存储量大和带宽消耗量大。 人们应该能够读取它,但是很难想象有人试图读取具有700万个节点的XML文件。 最基本的解析器功能不支持多种数据类型。 因此,常见的不规则或异常数据是困难的主要来源。

格式正确的XML

如果XML文档遵循所有XML语法规则,则其格式正确。 从技术的角度来说,如果文件格式不正确,则它不是XML。 HTML标记(例如<br>)在XML中是不可接受的; 标签应写成<br />格式良好的XML。 如果格式不正确,解析器将无法正确解析XML。 另外,一个XML文档必须只有一个根元素。 可以将一个根元素想像成一个无尽的文件柜。 您只有一个文件柜,但是对于可以放入文件柜的数量和数量没有什么限制。 有无尽的抽屉和文件夹,您可以在其中放入信息。

PHP基础

本文的大多数读者已经在使用PHP,但可能不了解它的历史和发展。

关于PHP

超文本预处理器(PHP)是跨平台的脚本语言,用于组成动态网页和服务器端应用程序软件。 它最初以个人主页/表格解释器(PHP / FI)的形式出现,并在1998年6月推出PHP3的Suraski和Gutmans手中重新焕发了新的生命。他们的公司Zend Technologies仍然管理着PHP的开发。

PHP5于2004年7月发布,由Zend Engine II提供支持,并包含许多新功能,例如:

  • 对面向对象编程的新支持
  • 更好地支持MySQL
  • 更好地支持XML,这正是您感兴趣的

PHP5和XML

虽然PHP从其早期版本开始提供XML支持,但是随着PHP5的引入,该支持呈指数增长。 由于对XMLPHP​​4支持受到一定的限制,例如仅提供默认情况下启用的基于SAX的解析器,而PHP4 DOM不实现W3C标准,因此,PHP XML开发人员重新发明了PHP5,并遵循了常用的规则。标准。

PHP5中XML的新功能

PHP5包括完全重写的新扩展,包括SAX解析器,DOM,SimpleXML,XMLReader,XMLWriter和XSLT处理器。 所有这些扩展现在都基于libxml2。

除了PHP4改进的SAX支持之外,PHP5还支持根据W3C标准的DOM和SimpleXML扩展。 默认情况下,SAX,DOM和SimpleXML均已启用。 如果您熟悉其他语言的DOM,那么使用PHP中的类似功能进行编码将比以前更加轻松。

在PHP5中阅读,操作和编写XML

对于需要使用简单,可预测且相对较小的XML文档以使用PHP5读取,操作和编写XML的开发人员而言,SimpleXML(在必要时与DOM结合使用)是理想的选择。

选择的快速入门API

在PHP5中可用的许多API中,对于DOM来说,DOM和SimpleXML是最熟悉的,对于SimpleXML来说,DOM和SimpleXML是最容易编写的代码。对于大多数常见情况,例如您正在此处处理的情况,最实用。

DOM扩展

文档对象模型(DOM)是用于表示HTML和XML文档的W3C标准对象集,有关如何组合这些对象的标准模型以及用于访问和操作它们的标准接口。 许多供应商都将DOM作为其专有数据结构和API的接口来支持,由于其对DOM模型的熟悉性,它为DOM模型提供了很多授权。 DOM易于理解和利用,因为它在内存中的结构类似于原始XML文档。 为了将信息传递给应用程序,DOM创建了一个对象树,该对象树精确地复制了XML文件中的元素树,每个XML元素都是该树中的一个节点。 DOM是基于树的解析器。 因为DOM会构建整个文档的树,所以它会占用大量内存和处理器时间。 因此,性能问题使使用DOM解析大型文档变得不切实际。 在本文的上下文中,DOM扩展的主要用途是它能够导入SimpleXML格式并输出DOM格式的XML(或相反)以用作字符串或XML文件。

SimpleXML

SimpleXML扩展名是解析XML文档的首选工具。 SimpleXML扩展需要PHP5并包括与DOM的互操作性,以用于编写XML文件和内置的XPath支持。 SimpleXML最适用于简单的,类似记录的数据,例如,作为文档或字符串从同一应用程序的另一个内部部分传递的XML。 只要XML文档没有太复杂,太深并且缺少混合内容,就如其名称所暗示的那样,SimpleXML比DOM更容易编码。 如果使用已知的文档结构,它也将更加可靠。

快速入门示例

这些是使用DOM和SimpleXML处理小型原始XML文件的快速入门示例。

行动中的DOM

DOM是您在浏览器中使用并使用JavaScript进行操作的W3C DOM规范。 它具有相同的方法,因此您将使用熟悉的编码技术。 清单2展示了使用DOM创建XML字符串和XML文档的方式,该格式的设置旨在使您的浏览更加愉快。

清单2.使用DOM
<?php 

 //Creates XML string and XML document using the DOM 
 $dom = new DomDocument('1.0'); 

 //add root - <books> 
 $books = $dom->appendChild($dom->createElement('books')); 

 //add <book> element to <books> 
 $book = $books->appendChild($dom->createElement('book')); 

 //add <title> element to <book> 
 $title = $book->appendChild($dom->createElement('title')); 

 //add <title> text node element to <title> 
 $title->appendChild( 
                 $dom->createTextNode('Great American Novel')); 

 //generate xml 
 $dom->formatOutput = true; // set the formatOutput attribute of 
                            // domDocument to true 
 // save XML as string or file 
 $test1 = $dom->saveXML(); // put string in test1 
 $dom->save('test1.xml'); // save as file 
 ?>

这将产生清单3中的输出文件。

清单3.输出文件
<?xml version="1.0"?>
 <books>
   <book>
     <title>Great American Novel</title>
   </book>
 </books>

清单4将SimpleXMLElement对象导入到DOMElement对象中,说明了DOM和SimpleXML的互操作性。

清单4.互操作性,第1部分-DOM导入SimpleXML
<?php
 
 $sxe = simplexml_load_string('<books><book><title>'.
       'Great American Novel</title></book></books>');
 
 if ($sxe === false) {
   echo 'Error while parsing the document';
   exit;
 }
 
 $dom_sxe = dom_import_simplexml($sxe);
 if (!$dom_sxe) {
   echo 'Error while converting XML';
   exit;
 }
 
 $dom = new DOMDocument('1.0');
 $dom_sxe = $dom->importNode($dom_sxe, true);
 $dom_sxe = $dom->appendChild($dom_sxe);
 
 echo $dom->save('test2.xml');
 
 ?>

清单5中的函数将DOM文档的一个节点放入一个SimpleXML节点。 然后,您可以将此新对象用作本机SimpleXML元素。 如果发生任何错误,则返回FALSE。

清单5.互操作性,第2部分-SimpleXML导入DOM
<?php
 $dom = new domDocument;
 $dom->loadXML('<books><book><title>Great American 
Novel</title></book></books>');
 if (!$dom) {
    echo 'Error while parsing the document';
    exit;
 }
 
 $s = simplexml_import_dom($dom);
 
 echo $s->book[0]->title; // Great American Novel
 ?>

运行中的SimpleXML

SimpleXML扩展名是解析XML文档的首选工具。 SimpleXML扩展包括与DOM的互操作性,以用于编写XML文件和内置的XPath支持。 顾名思义,SimpleXML比DOM更容易编码。

对于那些可能不熟悉PHP的人,清单6格式化了一个测试XML文件作为包含文件,以方便您使用。

清单6.在以下代码示例中,测试格式为PHP的XML文件包括example.php
<?php 
  $xmlstr = <<<XML 
  <books> 
  <book> 
   <title>Great American Novel</title> 
   <characters> 
    <character> 
     <name>Cliff</name> 
     <desc>really great guy</desc> 
    </character> 
    <character> 
     <name>Lovely Woman</name> 
     <desc>matchless beauty</desc> 
    </character> 
    <character> 
     <name>Loyal Dog</name> 
     <desc>sleepy</desc> 
    </character> 
   </characters> 
   <plot> 
    Cliff meets Lovely Woman.  Loyal Dog sleeps, but wakes up to bark 
    at mailman. 
   </plot> 
   <success type="bestseller">4</success> 
   <success type="bookclubs">9</success> 
  </book> 
  </books> 
XML; 
 ?>

在Ajax应用程序中,您可能希望从XML文档中提取邮政编码并查询数据库。 清单7从上面的示例XML中提取<plot>。

清单7.提取节点-获得节点有多容易?
<?php 

  include 'example.php'; 

  $xml = new SimpleXMLElement($xmlstr); 

  echo $xml->book[0]->plot; // "Cliff meets Lovely Woman. ..." 
  ?>

另一方面,您可能希望提取多行地址。 当一个元素的多个实例作为单个父元素的子代存在时,将应用常规迭代技术。 清单8演示了此功能。

清单8.提取一个元素的多个实例
<?php

  include 'example.php';
  
  $xml = new SimpleXMLElement($xmlstr);
  
  /* For each <book> node, echo a separate <plot>. */
  foreach ($xml->book as $book) {
    echo $book->plot, '<br />';
  }
  
  ?>

除了读取元素名称及其值之外,SimpleXML还可以访问元素属性。 在清单9中,就像访问数组元素一样访问元素的属性。

清单9.演示SimpleXML访问元素的属性
<?php

  //Input XML file repeated for your convenience  

  $xmlstr = <<<XML
  <?xml version='1.0' standalone='yes'?>

  <books>
   <book>
    <title>Great American Novel</title>
    <characters>
     <character>
      <name>Cliff</name>
      <desc>really great guy</desc>
     </character>
     <character>
      <name>Lovely Woman</name>
      <desc>matchless beauty</desc>
     </character>
     <character>
      <name>Loyal Dog</name>
      <desc>sleepy</desc>
     </character>
    </characters>
    <plot>
     Cliff meets Lovely Woman.  Loyal Dog sleeps, but wakes up to bark
     at mailman.
    </plot>
    <success type="bestseller">4</success>
    <success type="bookclubs">9</success>
   </book>
  </books>
XML;
  ?>

  <?php
  include 'example.php';
  
  $xml = new SimpleXMLElement($xmlstr);
  
  /* Access the <success> nodes of the first book.
  * Output the success indications, too. */
  foreach ($xml->book[0]->success as $success) {
     switch((string) $success['type']) { 
         // Get attributes as element indices
     case 'bestseller':
         echo $success, ' months on bestseller list';
         break;
     case 'bookclubs':
         echo $success, ' bookclub listings';
         break;
     }
  }
  ?>

若要将元素或属性与字符串进行比较或将其传递给需要字符串的函数,必须使用(string)将其强制转换为字符串。 否则,默认情况下,PHP将元素视为对象,如清单10所示。

清单10.称它为字符串或输
<?php
     
  include 'example.php';
  
  $xml = new SimpleXMLElement($xmlstr);
  
  if ((string) $xml->book->title == 'Great American Novel') {
     print 'My favorite book.';
  }
  
  htmlentities((string) $xml->book->title);
  ?>

SimpleXML中的数据不必恒定。 清单11将输出一个新XML文档,如下所示,与原始文档一样,不同之处在于新XML将把Cliff更改为Big Cliff。

清单11.使用SimpleXML更改文本节点
<?php 
  $xmlstr = <<<XML 
  <?xml version='1.0' standalone='yes'?> 
  <books> 
   <book> 
    <title>Great American Novel</title> 
    <characters> 
     <character> 
      <name>Cliff</name> 
      <desc>really great guy</desc> 
     </character> 
     <character> 
      <name>Lovely Woman</name> 
      <desc>matchless beauty</desc> 
     </character> 
     <character> 
      <name>Loyal Dog</name> 
      <desc>sleepy</desc> 
     </character> 
    </characters> 
    <plot> 
     Cliff meets Lovely Woman.  Loyal Dog sleeps, but wakes up to bark 
     at mailman. 
    </plot> 
    <success type="bestseller">4</success> 
    <success type="bookclubs">9</success> 
   </book> 
  </books> 
XML; 
   ?> 

  <?php 

  include 'example.php'; 
  $xml = new SimpleXMLElement($xmlstr); 

  $xml->book[0]->characters->character[0]->name = 'Big Cliff'; 

  echo $xml->asXML(); 
  ?>

从PHP 5.1.3开始,SimpleXML可以轻松添加子代和属性。 清单12将基于原始文档输出XML文档,但具有新的字符和描述符。

清单12.使用SimpleXML添加子节点和文本节点
<?php 
  $xmlstr = <<<XML 
  <?xml version='1.0' standalone='yes'?> 
  <books> 
   <book> 
    <title>Great American Novel</title> 
    <characters> 
     <character> 
      <name>Cliff</name> 
      <desc>really great guy</desc> 
     </character> 
     <character> 
      <name>Lovely Woman</name> 
      <desc>matchless beauty</desc> 
     </character> 
     <character> 
      <name>Loyal Dog</name> 
      <desc>sleepy</desc> 
     </character> 
     <character> 
      <name>Yellow Cat</name> 
      <desc>aloof</desc> 
     </character> 
    </characters> 
    <plot> 
     Cliff meets Lovely Woman.  Loyal Dog sleeps, but wakes up to bark 
     at mailman. 
    </plot> 
    <success type="bestseller">4</success> 
    <success type="bookclubs">9</success> 
   </book> 
  </books> 
XML; 
      ?> 

  <?php 
  include 'example.php'; 
  $xml = new SimpleXMLElement($xmlstr); 

  $character = $xml->book[0]->characters->addChild('character'); 
  $character->addChild('name', 'Yellow Cat'); 
  $character->addChild('desc', 'aloof'); 

  $success = $xml->book[0]->addChild('success', '2'); 
  $success->addAttribute('type', 'reprints'); 

  echo $xml->asXML(); 
  ?>

摘要

这个由三部分组成的系列文章中的第一篇文章重点介绍了快速入门API,展示了SimpleXML如何在必要时与DOM相结合,是使用简单,可预测且相对较小的XML文档的开发人员的理想选择。 PHP5极大地提高了开发人员在PHP中使用XML的能力。 第2部分将重点介绍高级XML解析技术。


翻译自: https://www.ibm.com/developerworks/opensource/library/x-xmlphp1/index.html

--enable-xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值