PHP XML示例

  • PHP XML示例

    SimpleXML解析器

    SimpleXML解析器用于解析名称,属性和文本内容。
    SimpleXML函数如下所示:
    使用simplexml_load_file(),此函数接受文件路径作为第一个参数,它是必需的。
    simplexml_load_file($fileName,$class,$options,$ns,$is_prefix)
    simplexml_load_string(),此函数接受字符串而不是文件引用。
    simplexml_load_string($XMLData,$class,$options,$ns,$is_prefix)
    simplexml_import_dom(),此函数接受DOM格式的XML内容,并将其转换为SimpleXML。
    simplexml_load_string($DOMNode,$class)
    以下示例显示了如何解析xml数据文件。
    <?php
    $data = "<?xml version = '1.0' encoding = 'UTF-8'?>
       
       <note>
          <Course>Android</Course>
          <Subject>Android</Subject>
          <Company>Jc2182</Company>
          <Price>¥10</Price>
       </note>";
    
    $xml = simplexml_load_string($data) or die("错误: 不能建立对象");
    ?>
    <html>
    
    <head>
    <body>
    
    <?php
    print_r($xml);
    ?>
    
    </body>
    </head>
    
    </html>
    
    尝试一下
    获取节点值
    以下代码提供了有关如何从xml文件获取节点值的信息,XML应如下所示
    <?php
    $xml  = <<<XML
    <?xml version = "1.0" encoding = "utf-8"?>
    <jc>
       
       <course category = "JAVA">
          <title lang = "en">Java</title>
          <tutor>Gopal</tutor>
          <duration>9</duration>
          <price>$30</price>
       </course>
       
       <course category = "HADOOP">
          <title lang = "en">Hadoop</title>.
          <tutor>Satish</tutor>
          <duration>3</duration>
          <price>$50</price>
       </course>
       
       <course category = "HTML">
          <title lang = "en">html</title>
          <tutor>raju</tutor>
          <duration>5</duration>
          <price>$50</price>
       </course>
       
       <course category = "WEB">
          <title lang = "en">Web 技术</title>
          <tutor>Javed</tutor>
          <duration>10</duration>
          <price>$60</price>
       </course>
    
    </jc>
    XML;
    ?>
    
    <html>
    <body>
    
    <?php
    $xmlObj = simplexml_load_string($xml) or die("错误:不能建立对象。");
    
    foreach($xmlObj->children() as $books) {
            echo $books->title . "<br> ";
            echo $books->tutor . "<br> ";
            echo $books->duration . "<br> ";
            echo $books->price . "<hr>";
    }
    ?>
    
    </body>
    </html>
    
    尝试一下

    SAX解析器

    SAX解析器用于解析xml文件,并且比样本xml解析器和DOM更适合内存管理。它不会将任何数据保存在内存中,因此可以用于非常大的文件。以下示例将说明如何使用SAX API从xml获取数据。
    sax.xml文件内容如下:
    <?xml version = "1.0" encoding = "utf-8"?>
    <tutors>
        <course>
            <name>Android</name>
            <country>China</country>
            <email>contact@jc2182.com</email>
            <phone>15912121212</phone>
        </course>
    
        <course>
            <name>Java</name>
            <country>China</country>
            <email>contact@jc2182.com</email>
            <phone>19912121212</phone>
        </course>
    
        <course>
            <name>HTML</name>
            <country>China</country>
            <email>contact@jc2182.com</email>
            <phone>18812121212</phone>
        </course>
    </tutors> 
    
    sax.php代码如下
    <html>
    <body>
    
    <?php
    //用SAX(Simple API for XML) 解析
    
    $tutors   = array();
    $elements   = null;
    
    /**
     * 标签开始时回调此函数
     * @param $parser resource
     * @param $name
     * @param $attrs
     */
    function startElements($parser, $name, $attrs) {
            global $tutors, $elements;
    
            if(!empty($name)) {
                    if ($name == 'COURSE') {
                            // 创建一个数组来存储信息
                            $tutors []= array();
                    }
                    $elements = $name;
            }
    }
    
    /**
     *
     * 标签关闭时调用此函数
     * @param $parser
     * @param $name
     */
    function endElements($parser, $name) {
            global $elements;
    
            if(!empty($name)) {
                    $elements = null;
            }
    }
    
    /**
     * 在标签的开头和结尾之间调用文本
     * @param $parser
     * @param $data
     */
    function characterData($parser, $data) {
            global $tutors, $elements;
    
            if(!empty($data)) {
                    if ($elements == 'NAME' || $elements == 'COUNTRY' ||  $elements == 'EMAIL' ||  $elements == 'PHONE') {
                            $tutors[count($tutors)-1][$elements] = trim($data);
                    }
            }
    }
    
    // 创建一个新的XML解析器并返回引用它的资源句柄以供其他XML函数使用。
    $parser = xml_parser_create();
    xml_set_element_handler($parser, "startElements", "endElements");
    xml_set_character_data_handler($parser, "characterData");
    
    //打开xml文件
    if (!($handle = fopen('sax.xml', "r"))) {
            die("不能打开xml文件");
    }
    
    while($data = fread($handle, 4096)){  // 从打开文件句柄读
            xml_parse($parser, $data); // 开始解析xml
    }
    
    xml_parser_free($parser); // 释放内存
    $i = 1;
    
    foreach($tutors as $course) {
            echo "course No - ".$i.'<br/>';
            echo "course Name - ".$course['NAME'].'<br/>';
            echo "Country - ".$course['COUNTRY'].'<br/>';
            echo "Email - ".$course['EMAIL'].'<br/>';
            echo "Phone - ".$course['PHONE'].'<hr/>';
            $i++;
    }
    ?>
    
    </body>
    </html>
    
    尝试一下

    DOM解析器

    用PHP5.X版本编写的HTML Dom解析器。Dom 解析器非常擅长处理XML和HTML。Dom解析器基于树进行传播,在访问数据之前,它会将数据加载到dom对象中,并将数据更新到Web浏览器。下面的示例显示了如何在Web浏览器中访问HTML数据。
    <?php
    $html = ' 
          <head> 
             <title>JC2182</title>
          </head> 
       
          <body> 
             <h2>课程详情</h2> 
          
             <table border = "0"> 
                <tbody> 
                   <tr> 
                      <td>Android</td> 
                      <td>Gopal</td> 
                      <td>Sairam</td> 
                   </tr> 
             
                   <tr> 
                      <td>Hadoop</td> 
                      <td>Gopal</td> 
                      <td>Satish</td> 
                   </tr> 
             
                   <tr> 
                      <td>HTML</td> 
                      <td>Gopal</td> 
                      <td>Raju</td> 
                   </tr> 
             
                   <tr> 
                      <td>Web 技术</td> 
                      <td>Gopal</td> 
                      <td>Javed</td> 
                   </tr> 
             
                   <tr> 
                      <td>Graphic</td> 
                      <td>Gopal</td> 
                      <td>Satish</td> 
                   </tr> 
             
                   <tr> 
                      <td>Writer</td> 
                      <td>Kiran</td> 
                      <td>Amith</td> 
                   </tr> 
             
                   <tr> 
                      <td>Writer</td> 
                      <td>Kiran</td> 
                      <td>Vineeth</td> 
                   </tr> 
                </tbody> 
             </table> 
          </body> 
       </html> 
       ';
    /*** 建立一个DOM对象 ***/
    $dom = new domDocument;
    
    /*** 把html字符串加载进来 前面拼接上HTML的声明和字符集***/
    $dom->loadHTML('<!DOCTYPE html><head><meta charset="UTF-8"></head> ' .$html);
    
    
    /*** 丢弃空白字符 ***/
    $dom->preserveWhiteSpace = false;
    
    /*** 获取表格标签 ***/
    $tables = $dom->getElementsByTagName('table');
    
    /*** 获取所有的表格行 ***/
    $rows = $tables->item(0)->getElementsByTagName('tr');
    
    /*** 循环表格的每一行 ***/
    foreach ($rows as $row) {
            /*** 获取每行的列标签 ***/
            $cols = $row->getElementsByTagName('td');
    
            /*** 输出每一列的值 ***/
    
            echo 'Designation: '.$cols->item(0)->nodeValue.'<br />';
            echo 'Manager: '.$cols->item(1)->nodeValue.'<br />';
            echo 'Team: '.$cols->item(2)->nodeValue;
            echo '<hr />';
    }
    ?>
    尝试一下