﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-十三郎的IT生活-随笔分类-语言</title><link>http://www.cnitblog.com/shisanlangd/category/8039.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 15:00:32 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 15:00:32 GMT</pubDate><ttl>60</ttl><item><title>PHP中检查库或函数是否可用的方法</title><link>http://www.cnitblog.com/shisanlangd/archive/2009/05/13/57188.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Wed, 13 May 2009 03:31:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2009/05/13/57188.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/57188.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2009/05/13/57188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/57188.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/57188.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text"><span class="Apple-style-span" style="word-spacing: 0px; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: 24px; font-size-adjust: none; font-stretch: normal; text-transform: none; color: #333333; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;">
<p style="margin: 15px 0px; padding: 0px;">本文介绍的函数其实是PHP手册上本来就有的，但是由于这些函数独立性较强，查找不易，所以单独介绍一下，方便查阅。</p>
<p style="margin: 15px 0px; padding: 0px;">1. 获取所有可用的模块 - get_loaded_extensions</p>
<p style="margin: 15px 0px; padding: 0px;"><code style="border-style: solid; border-color: #cccccc; border-width: 1px 1px 1px 3px; margin: 5px; padding: 10px; overflow: auto; display: block; width: 500px; white-space: normal; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #007700;">&lt;?</span><span style="margin: 0px; padding: 0px; color: #0000bb;">php<br style="margin: 0px; padding: 0px;">print_r</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #0000bb;">get_loaded_extensions</span><span style="margin: 0px; padding: 0px; color: #007700;">());<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #0000bb;">?&gt;</span></span></code></p>
<p style="margin: 15px 0px; padding: 0px;">2. 获取指定模块的可用函数 - get_extension_funcs</p>
<p style="margin: 15px 0px; padding: 0px;"><code style="border-style: solid; border-color: #cccccc; border-width: 1px 1px 1px 3px; margin: 5px; padding: 10px; overflow: auto; display: block; width: 500px; white-space: normal; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #007700;">&lt;?</span><span style="margin: 0px; padding: 0px; color: #0000bb;">php<br style="margin: 0px; padding: 0px;">print_r</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #0000bb;">get_extension_funcs</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #dd0000;">"mysql"</span><span style="margin: 0px; padding: 0px; color: #007700;">));<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #0000bb;">?&gt;</span></span></code></p>
<p style="margin: 15px 0px; padding: 0px;">3. 获取所有已经定义的函数 - get_defined_functions</p>
<p style="margin: 15px 0px; padding: 0px;"><code style="border-style: solid; border-color: #cccccc; border-width: 1px 1px 1px 3px; margin: 5px; padding: 10px; overflow: auto; display: block; width: 500px; white-space: normal; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #007700;">&lt;?</span><span style="margin: 0px; padding: 0px; color: #0000bb;">php<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #007700;">function </span><span style="margin: 0px; padding: 0px; color: #0000bb;">myrow</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #0000bb;">$id</span><span style="margin: 0px; padding: 0px; color: #007700;">, </span><span style="margin: 0px; padding: 0px; color: #0000bb;">$data</span><span style="margin: 0px; padding: 0px; color: #007700;">)<br style="margin: 0px; padding: 0px;">{<br style="margin: 0px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="margin: 0px; padding: 0px; color: #dd0000;">"&lt;tr&gt;&lt;th&gt;$id&lt;/th&gt;&lt;td&gt;$data&lt;/td&gt;&lt;/tr&gt;\n"</span><span style="margin: 0px; padding: 0px; color: #007700;">;<br style="margin: 0px; padding: 0px;">}<br style="margin: 0px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="margin: 0px; padding: 0px; color: #0000bb;">$arr </span><span style="margin: 0px; padding: 0px; color: #007700;">= </span><span style="margin: 0px; padding: 0px; color: #0000bb;">get_defined_functions</span><span style="margin: 0px; padding: 0px; color: #007700;">();<br style="margin: 0px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="margin: 0px; padding: 0px; color: #0000bb;">print_r</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #0000bb;">$arr</span><span style="margin: 0px; padding: 0px; color: #007700;">);<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #0000bb;">?&gt;</span></span></code></p>
<p style="margin: 15px 0px; padding: 0px;">其中 <strong style="margin: 0px; padding: 0px;">$arr["internal"]</strong> 是内置函数， <strong style="margin: 0px; padding: 0px;">$arr["user"]</strong> 是用户自定义函数。 </p>
<p style="margin: 15px 0px; padding: 0px;">4. 检查指定函数是否存在 - function_exists<br style="margin: 0px; padding: 0px;">该函数返回指定函数是否已经定义。</p>
<p style="margin: 15px 0px; padding: 0px;"><code style="border-style: solid; border-color: #cccccc; border-width: 1px 1px 1px 3px; margin: 5px; padding: 10px; overflow: auto; display: block; width: 500px; white-space: normal; background-color: #f8f8f8;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #007700;">&lt;?</span><span style="margin: 0px; padding: 0px; color: #0000bb;">php<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #007700;">if (</span><span style="margin: 0px; padding: 0px; color: #0000bb;">function_exists</span><span style="margin: 0px; padding: 0px; color: #007700;">(</span><span style="margin: 0px; padding: 0px; color: #dd0000;">'imap_open'</span><span style="margin: 0px; padding: 0px; color: #007700;">))<br style="margin: 0px; padding: 0px;">{<br style="margin: 0px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp; echo </span><span style="margin: 0px; padding: 0px; color: #dd0000;">"IMAP functions are available.&lt;br /&gt;\n"</span><span style="margin: 0px; padding: 0px; color: #007700;">;<br style="margin: 0px; padding: 0px;">} else {<br style="margin: 0px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp; echo </span><span style="margin: 0px; padding: 0px; color: #dd0000;">"IMAP functions are not available.&lt;br /&gt;\n"</span><span style="margin: 0px; padding: 0px; color: #007700;">; <br style="margin: 0px; padding: 0px;">}<br style="margin: 0px; padding: 0px;"></span><span style="margin: 0px; padding: 0px; color: #0000bb;">?&gt;</span></span></code></p>
</span></div><img src ="http://www.cnitblog.com/shisanlangd/aggbug/57188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2009-05-13 11:31 <a href="http://www.cnitblog.com/shisanlangd/archive/2009/05/13/57188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>时间戳 （含PHP实例）</title><link>http://www.cnitblog.com/shisanlangd/archive/2009/02/10/54392.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Tue, 10 Feb 2009 05:56:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2009/02/10/54392.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/54392.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2009/02/10/54392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/54392.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/54392.html</trackback:ping><description><![CDATA[&lt;?php<br>//查看时间戳<br>echo date_default_timezone_get();<br>//查看时间戳<br>date_default_timezone_set('Asia/Shanghai');<br>echo "\n";<br>//查看当前时间戳的时间<br>echo date('Y-m-d H:i:s',time());<br>echo "\n";<br>//时间戳运算<br>echo date('Y-m-d H:i:s',time()-1);<br>echo "\n";<br>//查看系统时间<br>echo `date`;<br>//查看时间戳开始时间<br>echo date('Y-m-d H:i:s',0);<br>echo "\n";<br>//查看时间戳开始值<br>echo mktime(8,0,0,1,1,1970);<br>echo "\n";<br>?&gt;<br><br>结果：<br>Asia/Chongqing<br>2009-02-09 17:19:00<br>2009-02-09 17:18:59<br>一&nbsp; 2月&nbsp; 9 17:19:00 CST 2009<br>1970-01-01 08:00:00<br>0<br><br>（Unix）时间戳（英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp）<br>是从1970年1月1日（UTC/GMT的午夜）开始所经过的秒数，不考虑闰秒。<br>时间戳0按照ISO 8601格式写出来为 1970-01-01T00:00:00Z 。一小时为3600秒，一个基准日（也称纪元日，epoch day）是86400秒，闰秒没有计算在内.多数Unix系统将时间戳以一个32位整型进行保存，这可能会在2038年1月19日产生一些问题（Y2038问题）。<br><br>
<table border="1">
    <tbody>
        <tr>
            <th>其他单位</th>
            <th align="right">秒</th>
        </tr>
        <tr>
            <td>1 分</td>
            <td align="right">60 秒</td>
        </tr>
        <tr>
            <td>1 小时</td>
            <td align="right">3600 秒</td>
        </tr>
        <tr>
            <td>1 天</td>
            <td align="right">86400 秒</td>
        </tr>
        <tr>
            <td>1 周</td>
            <td align="right">604800 秒</td>
        </tr>
        <tr>
            <td>1 月 (30.44 天)</td>
            <td align="right">2629743 秒</td>
        </tr>
        <tr>
            <td>1 年 (365.24 天)</td>
            <td align="right">31556926 秒</td>
        </tr>
    </tbody>
</table>
<br><br> <img src ="http://www.cnitblog.com/shisanlangd/aggbug/54392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2009-02-10 13:56 <a href="http://www.cnitblog.com/shisanlangd/archive/2009/02/10/54392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IP转换整形(ip2long)</title><link>http://www.cnitblog.com/shisanlangd/archive/2009/02/05/54289.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Thu, 05 Feb 2009 08:58:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2009/02/05/54289.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/54289.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2009/02/05/54289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/54289.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/54289.html</trackback:ping><description><![CDATA[如何将四个字段以点分开的IP网络址协议地址转换成整数呢？PHP里有这么一个函数ip2long.比如&nbsp;<br>&lt;?php&nbsp;<br>echo&nbsp;ip2long("10.2.1.3");&nbsp;<br>?&gt;&nbsp;<br>我们将得到&nbsp;<br>167903491&nbsp;<br><br>这是如何计算的，目前我知道有两个算法。其一&nbsp;<br>&lt;?php&nbsp;<br>function&nbsp;ip2int($ip){&nbsp;<br>&nbsp;&nbsp;&nbsp;//我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4&nbsp;<br>&nbsp;&nbsp;&nbsp;list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);&nbsp;<br>&nbsp;&nbsp;&nbsp;//然后第一段乘以256的三次方，第二段乘以256的平方，第三段乘以256&nbsp;<br>&nbsp;&nbsp;&nbsp;//这即是我们得到的值&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;$ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;&nbsp;<br>}&nbsp;<br>?&gt;&nbsp;<br><br>其二,用位运算&nbsp;<br>&lt;?php&nbsp;<br>function&nbsp;ip2int($ip){&nbsp;<br>&nbsp;&nbsp;&nbsp;list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;($ip1&lt;&lt;24)|($ip2&lt;&lt;16)|($ip3&lt;&lt;8)|($ip4);&nbsp;<br>}&nbsp;<br>?&gt;&nbsp;<br><br>我们会发现，有些ip转化成整数后，是负的，这是因为得到的结果是有符号整型，最大值是2147483647.要把它转化为无符号的，可以用&nbsp;<br>sprintf("%u",ip2long($ip);&nbsp;<br><br>就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的，如&nbsp;<br>&lt;?php&nbsp;<br>function&nbsp;chk_ip($ip){&nbsp;<br>&nbsp;&nbsp;&nbsp;if(ip2long($ip)=="-1")&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;<br>}&nbsp;<br>//应用&nbsp;<br>var_export(chk_ip("10.111.149.42"));&nbsp;<br>var_export(chk_ip("10.111.256.42"));&nbsp;<br>?&gt;&nbsp;<br>将输出true和false<br><br>转自：http://blog.csdn.net/wztgq/archive/2005/06/28/406662.aspx<br> <img src ="http://www.cnitblog.com/shisanlangd/aggbug/54289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2009-02-05 16:58 <a href="http://www.cnitblog.com/shisanlangd/archive/2009/02/05/54289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP安装PDO问题</title><link>http://www.cnitblog.com/shisanlangd/archive/2008/09/17/49182.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Wed, 17 Sep 2008 15:53:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2008/09/17/49182.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/49182.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2008/09/17/49182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/49182.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/49182.html</trackback:ping><description><![CDATA[configure: error: PDO_MYSQL configure failed. Please check config.log for more information<br>./configure <span style="color: red;">--enable-pdo --with-pdo-mysql=/usr/sbin/mysql_config</span> 即可<br><br>正常安装语句：<br>./configure --prefix=/usr/local/php --with-mysql --enable-pdo --with-pdo-mysql=/usr/sbin/mysql_config --with-apxs2=/usr/local/apache2/bin/apxs&nbsp; --with-libxml-dir=/usr/local --with-mysql-sock=/tmp/ --with-zlib-dir<br> <img src ="http://www.cnitblog.com/shisanlangd/aggbug/49182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2008-09-17 23:53 <a href="http://www.cnitblog.com/shisanlangd/archive/2008/09/17/49182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 PHP 读取和编写 XML DOM</title><link>http://www.cnitblog.com/shisanlangd/archive/2008/07/22/46998.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Tue, 22 Jul 2008 02:49:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2008/07/22/46998.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/46998.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2008/07/22/46998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/46998.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/46998.html</trackback:ping><description><![CDATA[<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td width="100%">
            <h1>用 PHP 读取和编写 XML DOM</h1>
            <p id="subtitle"><em>使用 DOM 库、SAX 解析器和正则表达式</em></p>
            <img src="http://www.ibm.com/i/c.gif" alt="" class="display-img" width="1" height="6"></td>
            <td class="no-print" width="192"><img src="http://www.ibm.com/developerworks/i/dw.gif" alt="developerWorks" width="192" height="18"></td>
        </tr>
    </tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td width="10"><img src="http://www.ibm.com/i/c.gif" alt="" width="10" height="1"></td>
            <td width="100%">
            <table class="no-print" align="right" border="0" cellpadding="0" cellspacing="0" width="160">
                <tbody>
                    <tr>
                        <td width="10"><img src="http://www.ibm.com/i/c.gif" alt="" width="10" height="1"></td>
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0" width="150">
                            <tbody>
                                <tr>
                                    <td class="v14-header-1-small">文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class="v14-gray-table-border" border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td class="no-padding" width="150"><img src="http://www.ibm.com/i/c.gif" alt="" width="8" height="1"><input value="有许多技术可用于用 php 读取和编写 xml。本文提供了三种方法读取 xml：使用 dom 库、使用 sax 解析器和使用正则表达式。还介绍了使用 dom 和 php 文本模板编写 xml。" name="body" type="hidden"><input value="用 php 读取和编写 xml dom" name="subject" type="hidden"><input value="cn" name="lang" type="hidden"><noscript>
                                    <tr
                                    valign="top">
                                    <td width="8"><img alt="" height="1" width="8"
                                    src="//www.ibm.com/i/c.gif"/></td>
                                    <td width="16"><img alt="" width="16"
                                    height="16" src="//www.ibm.com/i/c.gif"/></td>
                                    <td class="small"
                                    width="122">
                                    <p><span class="ast">未显示需要 JavaScript
                                    的文档选项</span></p>
                                    </td>
                                </tr>
                                </noscript>
                                <table border="0" cellpadding="0" cellspacing="0" width="143">
                                    <form action="https://www.ibm.com/developerworks/secure/email-it.jsp" name="email">
                                    </form>
                                    <script language="JavaScript" type="text/javascript">
                                    <!--
                                    document.write('
                                    <tr valign="top">
                                        <td width="8"><img src="//www.ibm.com/i/c.gif" src_cetemp="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                        <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" src_cetemp="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                        <td width="122">
                                        <p><a class="smallplainlink" href="javascript:document.email.submit();" href_cetemp="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                        </td>
                                    </tr>
                                    ');
                                    //-->
                                    </script>
                                    <tbody>
                                        <tr valign="top">
                                            <td width="8"><img src="http://www.ibm.com/i/c.gif" alt="" width="8" height="1"></td>
                                            <td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" alt="将此页作为电子邮件发送" vspace="3" width="16" height="16"></td>
                                            <td width="122">
                                            <p><a href="javascript:document.email.submit();" class="smallplainlink"><strong>将此页作为电子邮件发送</strong></a></p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                </tr>
            </tbody>
        </table>
        <p>级别： 中级</p>
        <p><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#author">Jack Herrington</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#99;&#107;&#95;&#100;&#95;&#104;&#101;&#114;&#114;&#105;&#110;&#103;&#116;&#111;&#110;&#64;&#99;&#111;&#100;&#101;&#103;&#101;&#110;&#101;&#114;&#97;&#116;&#105;&#111;&#110;&#46;&#110;&#101;&#116;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#37;&#69;&#55;&#37;&#57;&#52;&#37;&#65;&#56;&#37;&#50;&#48;&#80;&#72;&#80;&#37;&#50;&#48;&#37;&#69;&#56;&#37;&#65;&#70;&#37;&#66;&#66;&#37;&#69;&#53;&#37;&#56;&#70;&#37;&#57;&#54;&#37;&#69;&#53;&#37;&#57;&#50;&#37;&#56;&#67;&#37;&#69;&#55;&#37;&#66;&#67;&#37;&#57;&#54;&#37;&#69;&#53;&#37;&#56;&#54;&#37;&#57;&#57;&#37;&#50;&#48;&#88;&#77;&#76;&#37;&#50;&#48;&#68;&#79;&#77;">jack_d_herrington@codegeneration.net</a>), 高级软件工程师, "Code Generation Network"<br></p>
        <p>2006 年  2 月  06 日</p>
        <blockquote>有许多技术可用于用 PHP 读取和编写 XML。本文提供了三种方法读取 XML：使用 DOM 库、使用 SAX 解析器和使用正则表达式。还介绍了使用 DOM 和 PHP 文本模板编写 XML。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
        <!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
        <p>用 PHP 读取和编写可扩展标记语言（XML）看起来可能有点恐怖。实际上，XML 和它的所有相关技术可能是恐怖的，但是用 PHP
        读取和编写 XML 不一定是项恐怖的任务。首先，需要学习一点关于 XML 的知识 —— 它是什么，用它做什么。然后，需要学习如何用 PHP
        读取和编写 XML，而有许多种方式可以做这件事。</p>
        <p>本文提供了 XML 的简短入门，然后解释如何用 PHP 读取和编写 XML。</p>
        <p><a name="N10057"><span class="atitle">什么是 XML？</span></a></p>
        <p>XML 是一种数据存储格式。它没有定义保存什么数据，也没有定义数据的格式。XML 只是定义了标记和这些标记的属性。格式良好的 XML 标记看起来像这样：</p>
        <p><code>&lt;name&gt;Jack Herrington&lt;/name&gt;</code></p>
        <p>这个 <code>&lt;name&gt;</code> 标记包含一些文本：Jack Herrington。</p>
        <p>不包含文本的 XML 标记看起来像这样：</p>
        <p><code>&lt;powerUp /&gt;</code></p>
        <p>用 XML 对某件事进行编写的方式不止一种。例如，这个标记形成的输出与前一个标记相同：</p>
        <p><code>&lt;powerUp&gt;&lt;/powerUp&gt;</code></p>
        <p>也可以向 XML 标记添加属性。例如，这个 <code>&lt;name&gt;</code> 标记包含 <code>first</code> 和 <code>last</code> 属性：</p>
        <p><code>&lt;name first="Jack" last="Herrington" /&gt;</code></p>
        <p>也可以用 XML 对特殊字符进行编码。例如，&amp; 符号可以像这样编码：</p>
        <p><code>&amp;</code></p>
        <p>包含标记和属性的 XML 文件如果像示例一样格式化，就是<em>格式良好的</em>，这意味着标记是对称的，字符的编码正确。清单 1 是一份格式良好的 XML 的示例。</p>
        <br><a name="N100A2"><strong>清单 1. XML 图书列表示例</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;books&gt;<br>  &lt;book&gt;<br>  &lt;author&gt;Jack Herrington&lt;/author&gt;<br>  &lt;title&gt;PHP Hacks&lt;/title&gt;<br>  &lt;publisher&gt;O'Reilly&lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;book&gt;<br>  &lt;author&gt;Jack Herrington&lt;/author&gt;<br>  &lt;title&gt;Podcasting Hacks&lt;/title&gt;<br>  &lt;publisher&gt;O'Reilly&lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;/books&gt;<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>清单 1 中的 XML 包含一个图书列表。父标记 <code>&lt;books&gt;</code> 包含一组 <code>&lt;book&gt;</code> 标记，每个 <code>&lt;book&gt;</code> 标记又包含 <code>&lt;author&gt;</code>、<code>&lt;title&gt;</code> 和 <code>&lt;publisher&gt;</code> 标记。</p>
        <p>当 XML 文档的标记结构和内容得到外部模式文件的验证后，XML 文档就是正确的。模式文件可以用不同的格式指定。对于本文来说，所需要的只是格式良好的 XML。</p>
        <p>如果觉得 XML 看起来很像超文本标记语言（HTML），那么就对了。XML 和 HTML
        都是基于标记的语言，它们有许多相似之处。但是，要着重指出的是：虽然 XML 文档可能是格式良好的 HTML，但不是所有的 HTML
        文档都是格式良好的 XML。换行标记（<code>br</code>）是 XML 和 HTML 之间区别的一个好例子。这个换行标记是格式良好的 HTML，但不是格式良好的 XML：</p>
        <code>&lt;p&gt;This is a paragraph&lt;br&gt;<br>
        With a line break&lt;/p&gt;
        </code>
        <p>这个换行标记是格式良好的 XML 和 HTML：</p>
        <code>&lt;p&gt;This is a paragraph&lt;br /&gt;<br>
        With a line break&lt;/p&gt;
        </code>
        <p>如果要把 HTML 编写成同样是格式良好的 XML，请遵循 W3C 委员会的可扩展超文本标记语言（XHTML）标准（参见 <a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#resources">参考资料</a>）。所有现代的浏览器都能呈现 XHTML。而且，还可以用 XML 工具读取 XHTML 并找出文档中的数据，这比解析 HTML 容易得多。</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N100E4"><span class="atitle">使用 DOM 库读取 XML</span></a></p>
        <p>读取格式良好的 XML 文件最容易的方式是使用编译成某些 PHP 安装的文档对象模型 （DOM）库。DOM 库把整个 XML 文档读入内存，并用节点树表示它，如图 1 所示。</p>
        <br><a name="N100EF"><strong>图 1. 图书 XML 的 XML DOM 树</strong></a><br>
        <img src="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/figure1.gif" alt="图书 xml 的 xml dom 树" width="392" height="227">
        <br>
        <p>树顶部的 <code>books</code> 节点有两个 <code>book</code> 子标记。在每本书中，有 <code>author</code>、<code>publisher</code> 和 <code>title</code> 几个节点。<code>author</code>、<code>publisher</code> 和 <code>title</code> 节点分别有包含文本的文本子节点。</p>
        <p>读取图书 XML 文件并用 DOM 显示内容的代码如清单 2 所示。</p>
        <br><a name="N10126"><strong>清单 2. 用 DOM 读取图书 XML</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;?php<br>  $doc = new DOMDocument();<br>  $doc-&gt;load( 'books.xml' );<br>  <br>  $books = $doc-&gt;getElementsByTagName( "book" );<br>  foreach( $books as $book )<br>  {<br>  $authors = $book-&gt;getElementsByTagName( "author" );<br>  $author = $authors-&gt;item(0)-&gt;nodeValue;<br>  <br>  $publishers = $book-&gt;getElementsByTagName( "publisher" );<br>  $publisher = $publishers-&gt;item(0)-&gt;nodeValue;<br>  <br>  $titles = $book-&gt;getElementsByTagName( "title" );<br>  $title = $titles-&gt;item(0)-&gt;nodeValue;<br>  <br>  echo "$title - $author - $publisher\n";<br>  }<br>  ?&gt;<br>  </pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>脚本首先创建一个 <code>new DOMdocument</code> 对象，用 <code>load</code> 方法把图书 XML 装入这个对象。之后，脚本用 <code>getElementsByName</code> 方法得到指定名称下的所有元素的列表。</p>
        <p>在 <code>book</code> 节点的循环中，脚本用 <code>getElementsByName</code> 方法获得 <code>author</code>、<code>publisher</code> 和 <code>title</code> 标记的 <code>nodeValue</code>。<code>nodeValue</code> 是节点中的文本。脚本然后显示这些值。</p>
        <p>可以在命令行上像这样运行 PHP 脚本：</p>
        <code>% php e1.php <br>
        PHP Hacks - Jack Herrington - O'Reilly<br>
        Podcasting Hacks - Jack Herrington - O'Reilly<br>
        %</code>
        <p>可以看到，每个图书块输出一行。这是一个良好的开始。但是，如果不能访问 XML DOM 库该怎么办？</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N1016B"><span class="atitle">用 SAX 解析器读取 XML </span></a></p>
        <p>读取 XML 的另一种方法是使用 XML Simple API（SAX）解析器。PHP 的大多数安装都包含 SAX 解析器。SAX 解析器运行在回调模型上。每次打开或关闭一个标记时，或者每次解析器看到文本时，就用节点或文本的信息回调用户定义的函数。</p>
        <p>SAX 解析器的优点是，它是真正轻量级的。解析器不会在内存中长期保持内容，所以可以用于非常巨大的文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。清单 3 显示了使用 SAX 读取图书 XML 文件并显示内容的代码。</p>
        <br><a name="N1017B"><strong>清单 3. 用 SAX 解析器读取图书 XML </strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;?php<br>  $g_books = array();<br>  $g_elem = null;<br>  <br>  function startElement( $parser, $name, $attrs ) <br>  {<br>  global $g_books, $g_elem;<br>  if ( $name == 'BOOK' ) $g_books []= array();<br>  $g_elem = $name;<br>  }<br>  <br>  function endElement( $parser, $name ) <br>  {<br>  global $g_elem;<br>  $g_elem = null;<br>  }<br>  <br>  function textData( $parser, $text )<br>  {<br>  global $g_books, $g_elem;<br>  if ( $g_elem == 'AUTHOR' ||<br>  $g_elem == 'PUBLISHER' ||<br>  $g_elem == 'TITLE' )<br>  {<br>  $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;<br>  }<br>  }<br>  <br>  $parser = xml_parser_create();<br>  <br>  xml_set_element_handler( $parser, "startElement", "endElement" );<br>  xml_set_character_data_handler( $parser, "textData" );<br>  <br>  $f = fopen( 'books.xml', 'r' );<br>  <br>  while( $data = fread( $f, 4096 ) )<br>  {<br>  xml_parse( $parser, $data );<br>  }<br>  <br>  xml_parser_free( $parser );<br>  <br>  foreach( $g_books as $book )<br>  {<br>  echo $book['TITLE']." - ".$book['AUTHOR']." - ";<br>  echo $book['PUBLISHER']."\n";<br>  }<br>  ?&gt;<br>  </pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>脚本首先设置 <code>g_books</code> 数组，它在内存中容纳所有图书和图书信息，<code>g_elem</code> 变量保存脚本目前正在处理的标记的名称。然后脚本定义回调函数。在这个示例中，回调函数是 <code>startElement</code>、<code>endElement</code> 和 <code>textData</code>。在打开和关闭标记的时候，分别调用 <code>startElement</code> 和 <code>endElement</code> 函数。在开始和结束标记之间的文本上面，调用 <code>textData</code>。</p>
        <p>在这个示例中，<code>startElement</code> 标记查找 <code>book</code> 标记，在 <code>book</code> 数组中开始一个新元素。然后，<code>textData</code> 函数查看当前元素，看它是不是 <code>publisher</code>、<code>title</code> 或 <code>author</code> 标记。如果是，函数就把当前文本放入当前图书。</p>
        <p>为了让解析继续，脚本用 <code>xml_parser_create</code> 函数创建解析器。然后，设置回调句柄。之后，脚本读取文件并把文件的大块内容发送到解析器。在文件读取之后，<code>xml_parser_free</code> 函数删除解析器。脚本的末尾输出 <code>g_books</code> 数组的内容。</p>
        <p>可以看到，这比编写 DOM 的同样功能要困难得多。如果没有 DOM 库也没有 SAX 库该怎么办？还有替代方案么？</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N101D6"><span class="atitle">用正则表达式解析 XML</span></a></p>
        <p>可以肯定，即使提到这个方法，有些工程师也会批评我，但是确实可以用正则表达式解析 XML。清单 4 显示了使用 <code>preg_</code> 函数读取图书文件的示例。</p>
        <br><a name="N101E7"><strong>清单 4. 用正则表达式读取 XML</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;?php<br>  $xml = "";<br>  $f = fopen( 'books.xml', 'r' );<br>  while( $data = fread( $f, 4096 ) ) { $xml .= $data; }<br>  fclose( $f );<br>  <br>  preg_match_all( "/\&lt;book\&gt;(.*?)\&lt;\/book\&gt;/s", <br>  $xml, $bookblocks );<br>  <br>  foreach( $bookblocks[1] as $block )<br>  {<br>  preg_match_all( "/\&lt;author\&gt;(.*?)\&lt;\/author\&gt;/", <br>  $block, $author );<br>  preg_match_all( "/\&lt;title\&gt;(.*?)\&lt;\/title\&gt;/", <br>  $block, $title );<br>  preg_match_all( "/\&lt;publisher\&gt;(.*?)\&lt;\/publisher\&gt;/", <br>  $block, $publisher );<br>  echo( $title[1][0]." - ".$author[1][0]." - ".<br>  $publisher[1][0]."\n" );<br>  }<br>  ?&gt;<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>请注意这个代码有多短。开始时，它把文件读进一个大的字符串。然后用一个 <code>regex</code> 函数读取每个图书项目。最后用 <code>foreach</code> 循环，在每个图书块间循环，并提取出 author、title 和 publisher。</p>
        <p>那么，缺陷在哪呢？使用正则表达式代码读取 XML 的问题是，它并没先进行检查，确保 XML 的格式良好。这意味着在读取之前，无法知道 XML 是否格式良好。而且，有些格式正确的 XML 可能与正则表达式不匹配，所以日后必须修改它们。</p>
        <p>我从不建议使用正则表达式读取 XML，但是有时它是兼容性最好的方式，因为正则表达式函数总是可用的。不要用正则表达式读取直接来自用户的 XML，因为无法控制这类 XML 的格式或结构。应当一直用 DOM 库或 SAX 解析器读取来自用户的 XML。</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N101FF"><span class="atitle">用 DOM 编写 XML</span></a></p>
        <p>读取 XML 只是公式的一部分。该怎样编写 XML 呢？编写 XML 最好的方式就是用 DOM。清单 5 显示了 DOM 构建图书 XML 文件的方式。</p>
        <br><a name="N1020C"><strong>清单 5. 用 DOM 编写图书 XML</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;?php<br>  $books = array();<br>  $books [] = array(<br>  'title' =&gt; 'PHP Hacks',<br>  'author' =&gt; 'Jack Herrington',<br>  'publisher' =&gt; "O'Reilly"<br>  );<br>  $books [] = array(<br>  'title' =&gt; 'Podcasting Hacks',<br>  'author' =&gt; 'Jack Herrington',<br>  'publisher' =&gt; "O'Reilly"<br>  );<br>  <br>  $doc = new DOMDocument();<br>  $doc-&gt;formatOutput = true;<br>  <br>  $r = $doc-&gt;createElement( "books" );<br>  $doc-&gt;appendChild( $r );<br>  <br>  foreach( $books as $book )<br>  {<br>  $b = $doc-&gt;createElement( "book" );<br>  <br>  $author = $doc-&gt;createElement( "author" );<br>  $author-&gt;appendChild(<br>  $doc-&gt;createTextNode( $book['author'] )<br>  );<br>  $b-&gt;appendChild( $author );<br>  <br>  $title = $doc-&gt;createElement( "title" );<br>  $title-&gt;appendChild(<br>  $doc-&gt;createTextNode( $book['title'] )<br>  );<br>  $b-&gt;appendChild( $title );<br>  <br>  $publisher = $doc-&gt;createElement( "publisher" );<br>  $publisher-&gt;appendChild(<br>  $doc-&gt;createTextNode( $book['publisher'] )<br>  );<br>  $b-&gt;appendChild( $publisher );<br>  <br>  $r-&gt;appendChild( $b );<br>  }<br>  <br>  echo $doc-&gt;saveXML();<br>  ?&gt;<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>在脚本的顶部，用一些示例图书装入了 <code>books</code> 数组。这个数据可以来自用户也可以来自数据库。</p>
        <p>示例图书装入之后，脚本创建一个 <code>new DOMDocument</code>，并把根节点 <code>books</code> 添加到它。然后脚本为每本书的 author、title 和 publisher 创建节点，并为每个节点添加文本节点。每个 <code>book</code> 节点的最后一步是重新把它添加到根节点 <code>books</code>。</p>
        <p>脚本的末尾用 <code>saveXML</code> 方法把 XML 输出到控制台。（也可以用 <code>save</code> 方法创建一个 XML 文件。）脚本的输出如清单 6 所示。</p>
        <br><a name="N1023C"><strong>清单 6. DOM 构建脚本的输出</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  % php e4.php <br>  &lt;?xml version="1.0"?&gt;<br>  &lt;books&gt;<br>  &lt;book&gt;<br>  &lt;author&gt;Jack Herrington&lt;/author&gt;<br>  &lt;title&gt;PHP Hacks&lt;/title&gt;<br>  &lt;publisher&gt;O'Reilly&lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;book&gt;<br>  &lt;author&gt;Jack Herrington&lt;/author&gt;<br>  &lt;title&gt;Podcasting Hacks&lt;/title&gt;<br>  &lt;publisher&gt;O'Reilly&lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;/books&gt;<br>  %<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办？</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N10245"><span class="atitle">用 PHP 编写 XML</span></a></p>
        <p>如果 DOM 不可用，可以用 PHP 的文本模板编写 XML。清单 7 显示了 PHP 如何构建图书 XML 文件。</p>
        <br><a name="N10252"><strong>清单 7. 用 PHP 编写图书 XML</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode">  &lt;?php<br>  $books = array();<br>  $books [] = array(<br>  'title' =&gt; 'PHP Hacks',<br>  'author' =&gt; 'Jack Herrington',<br>  'publisher' =&gt; "O'Reilly"<br>  );<br>  $books [] = array(<br>  'title' =&gt; 'Podcasting Hacks',<br>  'author' =&gt; 'Jack Herrington',<br>  'publisher' =&gt; "O'Reilly"<br>  );<br>  ?&gt;<br>  &lt;books&gt;<br>  &lt;?php<br>  <br>  foreach( $books as $book )<br>  {<br>  ?&gt;<br>  &lt;book&gt;<br>  &lt;title&gt;&lt;?php echo( $book['title'] ); ?&gt;&lt;/title&gt;<br>  &lt;author&gt;&lt;?php echo( $book['author'] ); ?&gt;<br>  &lt;/author&gt;<br>  &lt;publisher&gt;&lt;?php echo( $book['publisher'] ); ?&gt;<br>  &lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;?php<br>  }<br>  ?&gt;<br>  &lt;/books&gt;<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>脚本的顶部与 DOM 脚本类似。脚本的底部打开 <code>books</code> 标记，然后在每个图书中迭代，创建 <code>book</code> 标记和所有的内部 <code>title</code>、<code>author</code> 和 <code>publisher</code> 标记。</p>
        <p>这种方法的问题是对实体进行编码。为了确保实体编码正确，必须在每个项目上调用 <code>htmlentities</code> 函数，如清单 8 所示。</p>
        <br><a name="N1027A"><strong>清单 8. 使用 htmlentities 函数对实体编码</strong></a><br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td class="code-outline">
                    <pre class="displaycode"> <br>  &lt;books&gt;<br>  &lt;?php<br>  <br>  foreach( $books as $book )<br>  {<br>  $title = htmlentities( $book['title'], ENT_QUOTES );<br>  $author = htmlentities( $book['author'], ENT_QUOTES );<br>  $publisher = htmlentities( $book['publisher'], ENT_QUOTES );<br>  ?&gt;<br>  &lt;book&gt;<br>  &lt;title&gt;&lt;?php echo( $title ); ?&gt;&lt;/title&gt;<br>  &lt;author&gt;&lt;?php echo( $author ); ?&gt; &lt;/author&gt;<br>  &lt;publisher&gt;&lt;?php echo( $publisher ); ?&gt;<br>  &lt;/publisher&gt;<br>  &lt;/book&gt;<br>  &lt;?php<br>  }<br>  ?&gt;<br>  &lt;/books&gt;<br></pre>
                    </td>
                </tr>
            </tbody>
        </table>
        <br>
        <p>这就是用基本的 PHP 编写 XML 的烦人之处。您以为自己创建了完美的 XML，但是在试图使用数据的时候，马上就会发现某些元素的编码不正确。</p>
        <br>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" alt="" border="0" width="8" height="6"></td>
                </tr>
            </tbody>
        </table>
        <table class="no-print" align="right" cellpadding="0" cellspacing="0">
            <tbody>
                <tr align="right">
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16"><br></td>
                                <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" class="fbox"><strong>回页首</strong></a></td>
                            </tr>
                        </tbody>
                    </table>
                    </td>
                </tr>
            </tbody>
        </table>
        <br><br>
        <p><a name="N10283"><span class="atitle">结束语</span></a></p>
        <p>XML 周围总有许多夸大之处和混淆之处。但是，并不像您想像的那么难 —— 特别是在 PHP 这样优秀的语言中。在理解并正确地实现了 XML 之后，就会发现有许多强大的工具可以使用。XPath 和 XSLT 就是这样两个值得研究的工具。</p>
        <br><br>
        <p><a name="resources"><span class="atitle">参考资料 </span></a></p>
        <strong>学习</strong><br>
        <ul>
            <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/opensource/library/os-xmldomphp/?S_TACT=105AGX52&amp;S_CMP=cn-a-os" target="_blank">英文原文</a>。<br><br></li>
            <li>
            在 <a href="http://www.w3.org/TR/xhtml1/">XHTML 1.0 The Extensible HyperText Markup Language</a> 上学习 XHTML 的标准。<br><br></li>
            <li>
            找到 <a href="http://www.w3.org/XML/">standards for XML</a>。<br><br></li>
            <li>
            了解 <a href="http://www.w3.org/TR/xpath">XML Path (XPath) language</a>。<br><br></li>
            <li>
            了解 <a href="http://www.w3.org/TR/xslt">XSL Transformations</a>，这是用于转换 XML 的语言。<br><br></li>
            <li>
            请阅读用来定义 XML 文档结构的标准 <a href="http://www.w3.org/XML/Schema">XML Schema</a>。<br><br></li>
            <li>
            在 developerWorks 的 <a href="http://www.ibm.com/developerworks/cn/xml/">XML 专区</a> 找到面向 XML 开发人员的更多资源。<br><br></li>
            <li>
            请访问 developerWorks 的 <a href="http://www.ibm.com/developerworks/cn/opensource">开放源码专区</a> 获得全面的 how-to 信息、工具和项目更新，帮助您用开放源码技术开发并把它们用于 IBM 产品。<br><br></li>
        </ul>
        <br><strong>获得产品和技术</strong><br>
        <ul>
            <li>
            请访问 <a href="http://php.net/">PHP.net</a>，了解关于 PHP 的最新新闻、找到下载，并向其他用户学习。<br><br></li>
            <li>了解 <a href="http://sourceforge.net/projects/expat/">Expat XML Parser</a>，这个解析器用来向 PHP 提供 SAX 解析器功能。<br><br></li>
            <li>
            利用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX52&amp;S_CMP=cn-a-os">IBM 试用软件</a> 改造您的下一个开放源码开发项目，可以下载也可以通过 DVD 得到。<br><br></li>
        </ul>
        <br><strong>讨论</strong><br>
        <ul>
            <li>通过参与 <a href="http://www.ibm.com/developerworks/blogs/?S_TACT=105AGX52&amp;S_CMP=cn-a-os">developerWorks blogs</a> 加入 developerWorks 社区。</li>
        </ul>
        <br><br>
        <p><a name="author"><span class="atitle">关于作者</span></a></p>
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
                <tr>
                    <td colspan="3"><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="5"></td>
                </tr>
                <tr align="left" valign="top">
                    <td><br></td>
                    <td><img src="http://www.ibm.com/i/c.gif" alt="" width="4" height="5"></td>
                    <td width="100%">
                    <p>Jack D. Herrington 是有 20 多年经验的高级软件工程师。他是三本书的作者：<em>Code Generation in Action</em>、<em>Podcasting Hacks</em> 和即将发表的 <em>PHP Hacks</em>。他还撰写了 30 多篇文章。</p>
                    </td>
                </tr>
            </tbody>
        </table>
        </td>
    </tr>
</tbody>
</table><img src ="http://www.cnitblog.com/shisanlangd/aggbug/46998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2008-07-22 10:49 <a href="http://www.cnitblog.com/shisanlangd/archive/2008/07/22/46998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP对JS函数escape的解析自定义函数代码</title><link>http://www.cnitblog.com/shisanlangd/archive/2008/02/27/40219.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Wed, 27 Feb 2008 09:22:00 GMT</pubDate><guid>http://www.cnitblog.com/shisanlangd/archive/2008/02/27/40219.html</guid><wfw:comment>http://www.cnitblog.com/shisanlangd/comments/40219.html</wfw:comment><comments>http://www.cnitblog.com/shisanlangd/archive/2008/02/27/40219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shisanlangd/comments/commentRss/40219.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shisanlangd/services/trackbacks/40219.html</trackback:ping><description><![CDATA[<p>将js的以%u开头的unicode编码(标准应为＆＃开头)，转换为utf-8编码．<br><br>&lt;?php<br>function unescape($source, $iconv_to = 'UTF-8') {<br>&nbsp;&nbsp;&nbsp; $decodedStr = '';<br>&nbsp;&nbsp;&nbsp; $pos = 0;<br>&nbsp;&nbsp;&nbsp; $len = strlen ($source);<br>&nbsp;&nbsp;&nbsp; while ($pos &lt; $len) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $charAt = substr ($source, $pos, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($charAt == '%') {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pos++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $charAt = substr ($source, $pos, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($charAt == 'u') {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // we got a unicode character<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pos++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $unicodeHexVal = substr ($source, $pos, 4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $unicode = hexdec ($unicodeHexVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $decodedStr .= code2utf($unicode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pos += 4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // we have an escaped ascii character<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $hexVal = substr ($source, $pos, 2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $decodedStr .= chr (hexdec ($hexVal));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pos += 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $decodedStr .= $charAt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pos++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if ($iconv_to != "UTF-8") {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $decodedStr = iconv("UTF-8", $iconv_to, $decodedStr);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return $decodedStr;<br>}<br>function code2utf($num){<br>&nbsp;&nbsp;&nbsp; if($num&lt;128)return chr($num);<br>&nbsp;&nbsp;&nbsp; if($num&lt;2048)return chr(($num&gt;&gt;6)+192).chr(($num&amp;63)+128);<br>&nbsp;&nbsp;&nbsp; if($num&lt;65536)return chr(($num&gt;&gt;12)+224).chr((($num&gt;&gt;6)&amp;63)+128).chr(($num&amp;63)+128);<br>&nbsp;&nbsp;&nbsp; if($num&lt;2097152)return chr(($num&gt;&gt;18)+240).chr((($num&gt;&gt;12)&amp;63)+128).chr((($num&gt;&gt;6)&amp;63)+128) .chr(($num&amp;63)+128);<br>&nbsp;&nbsp;&nbsp; return '';<br>}</p>
<p>$str = "%3d";<br>echo unescape($str);<br>?&gt;<br></p><img src ="http://www.cnitblog.com/shisanlangd/aggbug/40219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shisanlangd/" target="_blank">十三郎</a> 2008-02-27 17:22 <a href="http://www.cnitblog.com/shisanlangd/archive/2008/02/27/40219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>