你现在的位置:首页 > PHP网站建设知识库 > Joomla > 正文

Joomla XML 解析器规范

概述

joomla! 1.5 新增 JSimpleXML 类,可以更为简单的读取xml文件,但是现在还不能修改CDATA或或者属性,也不支持XPath.

JSimpleXML需要PHP 4.2以上版本,以及 Expat扩展。


2. 实现

JSimpleXML 类代码:


class JSimpleXML extends JObject  
{  
    /** 
    * Document element 
    * 
    * @var object 
    */  
    var $document = null;  
      
     /** 
     * Interprets a string of XML into an object 
     *  
     * This function will take the well-formed xml string data and return an object of class  
     * JSimpleXMLElement with properties containing the data held within the xml document.  
     * If any errors occur, it returns FALSE. 
     *  
     * @param string  Well-formed xml string data 
     * @param string  currently ignored 
     * @return object JSimpleXMLElement 
     */  
    function loadString($string, $classname = null)   
    {  
  $this->_parse($string);  
  return true;  
    }  
     /** 
     * Interprets an XML file into an object 
     *  
     * This function will convert the well-formed XML document in the file specified by  
     * filename to an object  of class JSimpleXMLElement. If any errors occur during file  
     * access or interpretation, the function returns FALSE. 
     *  
     * @param string  Path to xml file containing a well-formed XML document 
     * @param string  currently ignored 
     * @return object JSimpleXMLElement 
     */  
    function loadFile($path, $classname = null)   
    {  
  //Get the XML document loaded into a variable  
  $xml = file_get_contents($path);  
  $this->_parse($xml);  
  return true;  
    }  
    /** 
     * Get the parser 
     * 
     * @access public 
     * @return resource XML parser resource handle 
     */  
    function getParser() {  
  return $this->_parser;  
    }  
    /** 
     * Set the parser 
     *  
     * @access public 
     * @param resource XML parser resource handle 
     */  
    function setParser($parser) {  
  $this->_parser = $parser;  
    }  
}  

3. 使用

正如其名,JSimpleXML使用起来非常简单。你可以参考php5的SimpleXML文档,机关本质上两者有些不同,但是使用上是基 本兼容的。

来看一个xml文档的 例子(example.xml)

<?xml version='1.0' standalone='yes' ?>  
<movies>  
 <movie>  
  <title>PHP: Behind the Parser</title>  
  <characters>  
    <character>  
     <name>Ms. Coder</name>  
     <actor>Onlivia Actora</actor>  
    </character>  
    <character>  
     <name>Mr. Coder</name>  
     <actor>El ActÓr</actor>  
    </character>  
  </characters>  
  <plot>  
   So, this language. It's like, a programming language. Or is it a scripting language? All     
   is revealed in this thrilling horror spoof of a documentary.  
  </plot>  
  <rating type="thumbs">7</rating>  
  <rating type="stars">5</rating>  
 </movie>  
</movies>  
 
2.1 开始

首先要载入xml文档,在本例中我们要载入example.xml,JSimpleXML loadFile 方法载入相应文件的xml格式数据。loadFile其实使用 file_get_contents()方法读取文件,并把被荣传递给解析器。


<?php  
//Create a JSimpleXML object  
$xml = new JSimpleXML();  
//Load the xml file  
$xml->loadFile($file);  
?>  
 

XML解析器在解析文档时候发生错误会触发JError,如果没有任何错误,就会继续进行。

JSimpleXML的对象结构是直接了当的,文档的根包含在内。也就是说上例中$xml->document是根。$xml->document->movie[0]是第一个movie标签$xml->document->movie是一个数组,而不是JSimpleXMLElement对象。
 

2.2 使用JSimpleXML
例程1. 访问 CDATA 节点

<?php  
$xml = new JSimpleXML();  
$xml->loadFile($file);  
echo $xml->movie[0]->plot->data(); // "So this language. It's like..."  
?>   
 
例程2. 访问子节点
 
<?php  
$xml = new JSimpleXML();  
$xml->loadFile($file);  
/* For each <movie> node, we echo a separate <plot>. */  
foreach ($xml->movie->children() as $movie) {  
   echo $movie->plot->data(), '<br />';  
}  
?>   
 

例程 3. 访问节点属性

<?php  
$xml = new JSimpleXML();  
$xml->loadFile($file);  
/* Access the <rating> nodes of the first movie. 
 * Output the rating scale, too. */  
foreach ($xml->movie[0]->rating->children() as $rating) {  
   switch((string) $rating->attributes('type')) { // Get attributes as element indices  
   case 'thumbs':  
       echo $rating, ' thumbs up';  
       break;  
   case 'stars':  
       echo $rating, ' stars';  
       break;  
   }  
}  
?>   
 
4. Special Considerations


4.3 字符集

请注意字符集,解析器默认是UTF-8的字符集,目前没有方式来改变字符集,除非你修改源码。