﻿<?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>BlogJava-xiaomage234-随笔分类-xml</title><link>http://blogjava.net/xiaomage234/category/28214.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Fri, 05 Jun 2015 05:29:39 GMT</lastBuildDate><pubDate>Fri, 05 Jun 2015 05:29:39 GMT</pubDate><ttl>60</ttl><item><title>mybatis3-mapper dtd</title><link>http://www.blogjava.net/xiaomage234/archive/2015/06/05/425510.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 05 Jun 2015 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2015/06/05/425510.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/425510.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2015/06/05/425510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/425510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/425510.html</trackback:ping><description><![CDATA[<div>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</div><div>&lt;!--</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;Copyright 2009-2013 the original author or authors.</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;Licensed under the Apache License, Version 2.0 (the "License");</div><div>&nbsp; &nbsp; &nbsp; &nbsp;you may not use this file except in compliance with the License.</div><div>&nbsp; &nbsp; &nbsp; &nbsp;You may obtain a copy of the License at</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http://www.apache.org/licenses/LICENSE-2.0</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;Unless required by applicable law or agreed to in writing, software</div><div>&nbsp; &nbsp; &nbsp; &nbsp;distributed under the License is distributed on an "AS IS" BASIS,</div><div>&nbsp; &nbsp; &nbsp; &nbsp;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</div><div>&nbsp; &nbsp; &nbsp; &nbsp;See the License for the specific language governing permissions and</div><div>&nbsp; &nbsp; &nbsp; &nbsp;limitations under the License.</div><div></div><div>--&gt;</div><div></div><div>&lt;!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+&gt;</div><div>&lt;!ATTLIST mapper</div><div>xmlns:fo CDATA #IMPLIED</div><div>namespace CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT cache-ref EMPTY&gt;</div><div>&lt;!ATTLIST cache-ref</div><div>namespace CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT cache (property*)&gt;</div><div>&lt;!ATTLIST cache</div><div>type CDATA #IMPLIED</div><div>eviction CDATA #IMPLIED</div><div>flushInterval CDATA #IMPLIED</div><div>size CDATA #IMPLIED</div><div>readOnly CDATA #IMPLIED</div><div>blocking CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT parameterMap (parameter+)?&gt;</div><div>&lt;!ATTLIST parameterMap</div><div>id CDATA #REQUIRED</div><div>type CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT parameter EMPTY&gt;</div><div>&lt;!ATTLIST parameter</div><div>property CDATA #REQUIRED</div><div>javaType CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>mode (IN | OUT | INOUT) #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>scale CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)&gt;</div><div>&lt;!ATTLIST resultMap</div><div>id CDATA #REQUIRED</div><div>type CDATA #REQUIRED</div><div>extends CDATA #IMPLIED</div><div>autoMapping (true|false) #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT constructor (idArg*,arg*)&gt;</div><div></div><div>&lt;!ELEMENT id EMPTY&gt;</div><div>&lt;!ATTLIST id</div><div>property CDATA #IMPLIED</div><div>javaType CDATA #IMPLIED</div><div>column CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT result EMPTY&gt;</div><div>&lt;!ATTLIST result</div><div>property CDATA #IMPLIED</div><div>javaType CDATA #IMPLIED</div><div>column CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT idArg EMPTY&gt;</div><div>&lt;!ATTLIST idArg</div><div>javaType CDATA #IMPLIED</div><div>column CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>select CDATA #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT arg EMPTY&gt;</div><div>&lt;!ATTLIST arg</div><div>javaType CDATA #IMPLIED</div><div>column CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>select CDATA #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT collection (constructor?,id*,result*,association*,collection*, discriminator?)&gt;</div><div>&lt;!ATTLIST collection</div><div>property CDATA #REQUIRED</div><div>column CDATA #IMPLIED</div><div>javaType CDATA #IMPLIED</div><div>ofType CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>select CDATA #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>notNullColumn CDATA #IMPLIED</div><div>columnPrefix CDATA #IMPLIED</div><div>resultSet CDATA #IMPLIED</div><div>foreignColumn CDATA #IMPLIED</div><div>autoMapping (true|false) #IMPLIED</div><div>fetchType (lazy|eager) #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT association (constructor?,id*,result*,association*,collection*, discriminator?)&gt;</div><div>&lt;!ATTLIST association</div><div>property CDATA #REQUIRED</div><div>column CDATA #IMPLIED</div><div>javaType CDATA #IMPLIED</div><div>jdbcType CDATA #IMPLIED</div><div>select CDATA #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>notNullColumn CDATA #IMPLIED</div><div>columnPrefix CDATA #IMPLIED</div><div>resultSet CDATA #IMPLIED</div><div>foreignColumn CDATA #IMPLIED</div><div>autoMapping (true|false) #IMPLIED</div><div>fetchType (lazy|eager) #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT discriminator (case+)&gt;</div><div>&lt;!ATTLIST discriminator</div><div>column CDATA #IMPLIED</div><div>javaType CDATA #REQUIRED</div><div>jdbcType CDATA #IMPLIED</div><div>typeHandler CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT case (constructor?,id*,result*,association*,collection*, discriminator?)&gt;</div><div>&lt;!ATTLIST case</div><div>value CDATA #REQUIRED</div><div>resultMap CDATA #IMPLIED</div><div>resultType CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT property EMPTY&gt;</div><div>&lt;!ATTLIST property</div><div>name CDATA #REQUIRED</div><div>value CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT typeAlias EMPTY&gt;</div><div>&lt;!ATTLIST typeAlias</div><div>alias CDATA #REQUIRED</div><div>type CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT select (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST select</div><div>id CDATA #REQUIRED</div><div>parameterMap CDATA #IMPLIED</div><div>parameterType CDATA #IMPLIED</div><div>resultMap CDATA #IMPLIED</div><div>resultType CDATA #IMPLIED</div><div>resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED</div><div>statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED</div><div>fetchSize CDATA #IMPLIED</div><div>timeout CDATA #IMPLIED</div><div>flushCache (true|false) #IMPLIED</div><div>useCache (true|false) #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>lang CDATA #IMPLIED</div><div>resultOrdered (true|false) #IMPLIED</div><div>resultSets CDATA #IMPLIED&nbsp;</div><div>&gt;</div><div></div><div>&lt;!ELEMENT insert (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST insert</div><div>id CDATA #REQUIRED</div><div>parameterMap CDATA #IMPLIED</div><div>parameterType CDATA #IMPLIED</div><div>timeout CDATA #IMPLIED</div><div>flushCache (true|false) #IMPLIED</div><div>statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED</div><div>keyProperty CDATA #IMPLIED</div><div>useGeneratedKeys (true|false) #IMPLIED</div><div>keyColumn CDATA #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>lang CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT selectKey (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST selectKey</div><div>resultType CDATA #IMPLIED</div><div>statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED</div><div>keyProperty CDATA #IMPLIED</div><div>keyColumn CDATA #IMPLIED</div><div>order (BEFORE|AFTER) #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT update (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST update</div><div>id CDATA #REQUIRED</div><div>parameterMap CDATA #IMPLIED</div><div>parameterType CDATA #IMPLIED</div><div>timeout CDATA #IMPLIED</div><div>flushCache (true|false) #IMPLIED</div><div>statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED</div><div>keyProperty CDATA #IMPLIED</div><div>useGeneratedKeys (true|false) #IMPLIED</div><div>keyColumn CDATA #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>lang CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT delete (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST delete</div><div>id CDATA #REQUIRED</div><div>parameterMap CDATA #IMPLIED</div><div>parameterType CDATA #IMPLIED</div><div>timeout CDATA #IMPLIED</div><div>flushCache (true|false) #IMPLIED</div><div>statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>lang CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!-- Dynamic --&gt;</div><div></div><div>&lt;!ELEMENT include (property+)?&gt;</div><div>&lt;!ATTLIST include</div><div>refid CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT bind EMPTY&gt;</div><div>&lt;!ATTLIST bind</div><div>&nbsp;name CDATA #REQUIRED</div><div>&nbsp;value CDATA #REQUIRED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT sql (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST sql</div><div>id CDATA #REQUIRED</div><div>lang CDATA #IMPLIED</div><div>databaseId CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT trim (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST trim</div><div>prefix CDATA #IMPLIED</div><div>prefixOverrides CDATA #IMPLIED</div><div>suffix CDATA #IMPLIED</div><div>suffixOverrides CDATA #IMPLIED</div><div>&gt;</div><div>&lt;!ELEMENT where (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ELEMENT set (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div></div><div>&lt;!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST foreach</div><div>collection CDATA #REQUIRED</div><div>item CDATA #IMPLIED</div><div>index CDATA #IMPLIED</div><div>open CDATA #IMPLIED</div><div>close CDATA #IMPLIED</div><div>separator CDATA #IMPLIED</div><div>&gt;</div><div></div><div>&lt;!ELEMENT choose (when* , otherwise?)&gt;</div><div>&lt;!ELEMENT when (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST when</div><div>test CDATA #REQUIRED</div><div>&gt;</div><div>&lt;!ELEMENT otherwise (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div></div><div>&lt;!ELEMENT if (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*&gt;</div><div>&lt;!ATTLIST if</div><div>test CDATA #REQUIRED</div><div>&gt;</div><div></div><div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/425510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2015-06-05 11:36 <a href="http://www.blogjava.net/xiaomage234/archive/2015/06/05/425510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP5如何判断RuntimeException,中断程序执行</title><link>http://www.blogjava.net/xiaomage234/archive/2009/03/10/258824.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 10 Mar 2009 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/03/10/258824.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/258824.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/03/10/258824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/258824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/258824.html</trackback:ping><description><![CDATA[用操作符"@"获取操作执行的句柄，然后判断这个句柄的boolean值。如果发生问题，自己抛出Exception.<br />
比如下面一个解析xml可能遇到的运行时异常：<br />
try{<br />
&nbsp;$doc = new DOMDocument();<br />
&nbsp;$aa = @$doc-&gt;load('C:/cinema_data.xml');<br />
&nbsp;echo $aa;<br />
&nbsp;if(!$aa){<br />
&nbsp;&nbsp;throw&nbsp; new Exception('ocur excep');<br />
&nbsp;}<br />
&nbsp;echo 'ccc';<br />
}catch(Exception $e){<br />
&nbsp;//echo $e-&gt;getTrace();<br />
&nbsp;echo 'bbb';<br />
&nbsp;exit;<br />
}<br />
<br />
可以看到，发生异常时，echo 'ccc'是没执行的。
<img src ="http://www.blogjava.net/xiaomage234/aggbug/258824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-03-10 16:08 <a href="http://www.blogjava.net/xiaomage234/archive/2009/03/10/258824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 PHP 读取和编写 XML DOM [摘]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/03/09/258595.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 09 Mar 2009 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/03/09/258595.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/258595.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/03/09/258595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/258595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/258595.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td width="100%">
            <p id="subtitle"><em>使用 DOM 库、SAX 解析器和正则表达式</em></p>
            <img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" /></td>
            <td class="no-print" width="192"><img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" /></td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td width="100%">
            <table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
                <tbody>
                    <tr>
                        <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
                        <td>
                        <table cellspacing="0" cellpadding="0" width="150" border="0">
                            <tbody>
                                <tr>
                                    <td class="v14-header-1-small">文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td class="no-padding" width="150"></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" cmimpressionsent="1">Jack Herrington</a> (<a href="mailto:jack_d_herrington@codegeneration.net?subject=用 PHP 读取和编写 XML DOM" cmimpressionsent="1">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="N1004E"><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="N10099"><strong>清单 1. XML 图书列表示例</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;books&gt;
                        &lt;book&gt;
                        &lt;author&gt;Jack Herrington&lt;/author&gt;
                        &lt;title&gt;PHP Hacks&lt;/title&gt;
                        &lt;publisher&gt;O'Reilly&lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;book&gt;
                        &lt;author&gt;Jack Herrington&lt;/author&gt;
                        &lt;title&gt;Podcasting Hacks&lt;/title&gt;
                        &lt;publisher&gt;O'Reilly&lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;/books&gt;
                        </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" cmimpressionsent="1">参考资料</a>）。所有现代的浏览器都能呈现 XHTML。而且，还可以用 XML 工具读取 XHTML 并找出文档中的数据，这比解析 HTML 容易得多。</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N100DB"><span class="atitle">使用 DOM 库读取 XML</span></a></p>
            <p>读取格式良好的 XML 文件最容易的方式是使用编译成某些 PHP 安装的文档对象模型 （DOM）库。DOM 库把整个 XML 文档读入内存，并用节点树表示它，如图 1 所示。</p>
            <br />
            <a name="N100E6"><strong>图 1. 图书 XML 的 XML DOM 树</strong></a><br />
            <img height="227" alt="图书 XML 的 XML DOM 树" src="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/figure1.gif" width="392" /> <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="N1011D"><strong>清单 2. 用 DOM 读取图书 XML</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;?php
                        $doc = new DOMDocument();
                        $doc-&gt;load( 'books.xml' );
                        $books = $doc-&gt;getElementsByTagName( "book" );
                        foreach( $books as $book )
                        {
                        $authors = $book-&gt;getElementsByTagName( "author" );
                        $author = $authors-&gt;item(0)-&gt;nodeValue;
                        $publishers = $book-&gt;getElementsByTagName( "publisher" );
                        $publisher = $publishers-&gt;item(0)-&gt;nodeValue;
                        $titles = $book-&gt;getElementsByTagName( "title" );
                        $title = $titles-&gt;item(0)-&gt;nodeValue;
                        echo "$title - $author - $publisher\n";
                        }
                        ?&gt;
                        </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 cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N10162"><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="N10172"><strong>清单 3. 用 SAX 解析器读取图书 XML </strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;?php
                        $g_books = array();
                        $g_elem = null;
                        function startElement( $parser, $name, $attrs )
                        {
                        global $g_books, $g_elem;
                        if ( $name == 'BOOK' ) $g_books []= array();
                        $g_elem = $name;
                        }
                        function endElement( $parser, $name )
                        {
                        global $g_elem;
                        $g_elem = null;
                        }
                        function textData( $parser, $text )
                        {
                        global $g_books, $g_elem;
                        if ( $g_elem == 'AUTHOR' ||
                        $g_elem == 'PUBLISHER' ||
                        $g_elem == 'TITLE' )
                        {
                        $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
                        }
                        }
                        $parser = xml_parser_create();
                        xml_set_element_handler( $parser, "startElement", "endElement" );
                        xml_set_character_data_handler( $parser, "textData" );
                        $f = fopen( 'books.xml', 'r' );
                        while( $data = fread( $f, 4096 ) )
                        {
                        xml_parse( $parser, $data );
                        }
                        xml_parser_free( $parser );
                        foreach( $g_books as $book )
                        {
                        echo $book['TITLE']." - ".$book['AUTHOR']." - ";
                        echo $book['PUBLISHER']."\n";
                        }
                        ?&gt;
                        </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 cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N101CD"><span class="atitle">用正则表达式解析 XML</span></a></p>
            <p>可以肯定，即使提到这个方法，有些工程师也会批评我，但是确实可以用正则表达式解析 XML。清单 4 显示了使用 <code>preg_</code> 函数读取图书文件的示例。</p>
            <br />
            <a name="N101DE"><strong>清单 4. 用正则表达式读取 XML</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;?php
                        $xml = "";
                        $f = fopen( 'books.xml', 'r' );
                        while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
                        fclose( $f );
                        preg_match_all( "/\&lt;book\&gt;(.*?)\&lt;\/book\&gt;/s",
                        $xml, $bookblocks );
                        foreach( $bookblocks[1] as $block )
                        {
                        preg_match_all( "/\&lt;author\&gt;(.*?)\&lt;\/author\&gt;/",
                        $block, $author );
                        preg_match_all( "/\&lt;title\&gt;(.*?)\&lt;\/title\&gt;/",
                        $block, $title );
                        preg_match_all( "/\&lt;publisher\&gt;(.*?)\&lt;\/publisher\&gt;/",
                        $block, $publisher );
                        echo( $title[1][0]." - ".$author[1][0]." - ".
                        $publisher[1][0]."\n" );
                        }
                        ?&gt;
                        </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 cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N101F6"><span class="atitle">用 DOM 编写 XML</span></a></p>
            <p>读取 XML 只是公式的一部分。该怎样编写 XML 呢？编写 XML 最好的方式就是用 DOM。清单 5 显示了 DOM 构建图书 XML 文件的方式。</p>
            <br />
            <a name="N10203"><strong>清单 5. 用 DOM 编写图书 XML</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;?php
                        $books = array();
                        $books [] = array(
                        'title' =&gt; 'PHP Hacks',
                        'author' =&gt; 'Jack Herrington',
                        'publisher' =&gt; "O'Reilly"
                        );
                        $books [] = array(
                        'title' =&gt; 'Podcasting Hacks',
                        'author' =&gt; 'Jack Herrington',
                        'publisher' =&gt; "O'Reilly"
                        );
                        $doc = new DOMDocument();
                        $doc-&gt;formatOutput = true;
                        $r = $doc-&gt;createElement( "books" );
                        $doc-&gt;appendChild( $r );
                        foreach( $books as $book )
                        {
                        $b = $doc-&gt;createElement( "book" );
                        $author = $doc-&gt;createElement( "author" );
                        $author-&gt;appendChild(
                        $doc-&gt;createTextNode( $book['author'] )
                        );
                        $b-&gt;appendChild( $author );
                        $title = $doc-&gt;createElement( "title" );
                        $title-&gt;appendChild(
                        $doc-&gt;createTextNode( $book['title'] )
                        );
                        $b-&gt;appendChild( $title );
                        $publisher = $doc-&gt;createElement( "publisher" );
                        $publisher-&gt;appendChild(
                        $doc-&gt;createTextNode( $book['publisher'] )
                        );
                        $b-&gt;appendChild( $publisher );
                        $r-&gt;appendChild( $b );
                        }
                        echo $doc-&gt;saveXML();
                        ?&gt;
                        </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="N10233"><strong>清单 6. DOM 构建脚本的输出</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  % php e4.php
                        &lt;?xml version="1.0"?&gt;
                        &lt;books&gt;
                        &lt;book&gt;
                        &lt;author&gt;Jack Herrington&lt;/author&gt;
                        &lt;title&gt;PHP Hacks&lt;/title&gt;
                        &lt;publisher&gt;O'Reilly&lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;book&gt;
                        &lt;author&gt;Jack Herrington&lt;/author&gt;
                        &lt;title&gt;Podcasting Hacks&lt;/title&gt;
                        &lt;publisher&gt;O'Reilly&lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;/books&gt;
                        %
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办？</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N1023C"><span class="atitle">用 PHP 编写 XML</span></a></p>
            <p>如果 DOM 不可用，可以用 PHP 的文本模板编写 XML。清单 7 显示了 PHP 如何构建图书 XML 文件。</p>
            <br />
            <a name="N10249"><strong>清单 7. 用 PHP 编写图书 XML</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">  &lt;?php
                        $books = array();
                        $books [] = array(
                        'title' =&gt; 'PHP Hacks',
                        'author' =&gt; 'Jack Herrington',
                        'publisher' =&gt; "O'Reilly"
                        );
                        $books [] = array(
                        'title' =&gt; 'Podcasting Hacks',
                        'author' =&gt; 'Jack Herrington',
                        'publisher' =&gt; "O'Reilly"
                        );
                        ?&gt;
                        &lt;books&gt;
                        &lt;?php
                        foreach( $books as $book )
                        {
                        ?&gt;
                        &lt;book&gt;
                        &lt;title&gt;&lt;?php echo( $book['title'] ); ?&gt;&lt;/title&gt;
                        &lt;author&gt;&lt;?php echo( $book['author'] ); ?&gt;
                        &lt;/author&gt;
                        &lt;publisher&gt;&lt;?php echo( $book['publisher'] ); ?&gt;
                        &lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;?php
                        }
                        ?&gt;
                        &lt;/books&gt;
                        </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="N10271"><strong>清单 8. 使用 htmlentities 函数对实体编码</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">
                        &lt;books&gt;
                        &lt;?php
                        foreach( $books as $book )
                        {
                        $title = htmlentities( $book['title'], ENT_QUOTES );
                        $author = htmlentities( $book['author'], ENT_QUOTES );
                        $publisher = htmlentities( $book['publisher'], ENT_QUOTES );
                        ?&gt;
                        &lt;book&gt;
                        &lt;title&gt;&lt;?php echo( $title ); ?&gt;&lt;/title&gt;
                        &lt;author&gt;&lt;?php echo( $author ); ?&gt; &lt;/author&gt;
                        &lt;publisher&gt;&lt;?php echo( $publisher ); ?&gt;
                        &lt;/publisher&gt;
                        &lt;/book&gt;
                        &lt;?php
                        }
                        ?&gt;
                        &lt;/books&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>这就是用基本的 PHP 编写 XML 的烦人之处。您以为自己创建了完美的 XML，但是在试图使用数据的时候，马上就会发现某些元素的编码不正确。</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N1027A"><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" cmimpressionsent="1">英文原文</a>。<br />
                <br />
                <li>在 <a href="http://www.w3.org/TR/xhtml1/" cmimpressionsent="1">XHTML 1.0 The Extensible HyperText Markup Language</a> 上学习 XHTML 的标准。<br />
                <br />
                <li>找到 <a href="http://www.w3.org/XML/" cmimpressionsent="1">standards for XML</a>。<br />
                <br />
                <li>了解 <a href="http://www.w3.org/TR/xpath" cmimpressionsent="1">XML Path (XPath) language</a>。<br />
                <br />
                <li>了解 <a href="http://www.w3.org/TR/xslt" cmimpressionsent="1">XSL Transformations</a>，这是用于转换 XML 的语言。<br />
                <br />
                <li>请阅读用来定义 XML 文档结构的标准 <a href="http://www.w3.org/XML/Schema" cmimpressionsent="1">XML Schema</a>。<br />
                <br />
                <li>在 developerWorks 的 <a href="http://www.ibm.com/developerworks/cn/xml/" cmimpressionsent="1">XML 专区</a> 找到面向 XML 开发人员的更多资源。<br />
                <br />
                <li>请访问 developerWorks 的 <a href="http://www.ibm.com/developerworks/cn/opensource" cmimpressionsent="1">开放源码专区</a> 获得全面的 how-to 信息、工具和项目更新，帮助您用开放源码技术开发并把它们用于 IBM 产品。<br />
                <br />
                </li>
            </ul>
            <br />
            <strong>获得产品和技术</strong><br />
            <ul>
                <li>请访问 <a href="http://php.net/" cmimpressionsent="1">PHP.net</a>，了解关于 PHP 的最新新闻、找到下载，并向其他用户学习。<br />
                <br />
                <li>了解 <a href="http://sourceforge.net/projects/expat/" cmimpressionsent="1">Expat XML Parser</a>，这个解析器用来向 PHP 提供 SAX 解析器功能。<br />
                <br />
                <li>利用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX52&amp;S_CMP=cn-a-os" cmimpressionsent="1">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" cmimpressionsent="1">developerWorks blogs</a> 加入 developerWorks 社区。</li>
            </ul>
            <br />
            <br />
            <p><a name="author"><span class="atitle">关于作者</span></a></p>
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
                    </tr>
                    <tr valign="top" align="left">
                        <td>
                        <p>&nbsp;</p>
                        </td>
                        <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></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.blogjava.net/xiaomage234/aggbug/258595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-03-09 14:43 <a href="http://www.blogjava.net/xiaomage234/archive/2009/03/09/258595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]XML api折射出sun与IBM的恩仇</title><link>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228540.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 12 Sep 2008 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228540.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/228540.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/228540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/228540.html</trackback:ping><description><![CDATA[<p>最初的xml解析器是sun的Crimson和IBM的Xerces，这两个开源项目都捐给了apache组织，后来Xerces发展很快，Crimon基本没有人使用。<br />
1.4 版本起，用于 XML 处理的 Java API 就已经加入了Java 2 平台中。 利用该 API，可通过一系列标准的 Java 平台 API 来处理 XML 文档。<br />
&nbsp;因此，也就无需另外添加 XML 处理包了。sun的JDK1.4使用Crimson，IBM的JDK使用Xerces。<br />
如果打算把sun 的jdk程序移植到IBM的JDK下，注意解析器不同，XML处理会出问题。这就说明了java不是&#8220;一次编译，到处运行&#8221;，而是&#8220;一次编译，到处调试&#8221;。<br />
如果你把IBM的JDK移植到SUN的JDK下，即使把Xerces包引入CLASSPATH，JDK还是使用Crimson，不信你运行java -verbose试一试。<br />
解决的办法就是在在JRE\lib\目录下，建立一个jaxp.properties的文件，<br />
内容如下：<br />
&nbsp;&nbsp;&nbsp; javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl<br />
&nbsp;&nbsp;&nbsp; javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl<br />
就可以使用Xerces。<br />
或者使用命令行<br />
# Add the XML parser jars and set the JAXP factory names<br />
# Crimson parser JAXP setup(default)<br />
CLASSPATH=$CLASSPATH:../lib/crimson.jar<br />
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl<br />
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"<br />
或<br />
# Add the XML parser jars and set the JAXP factory names<br />
# Xerces parser JAXP setup<br />
CLASSPATH=$CLASSPATH:../lib/xerces.jar<br />
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl<br />
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"<br />
最终sun还是指定JAXP规范，JSR 206 Java API for XML Processing(JAXP) 1.3，他已经由JDK1.5实现。<br />
JAXP实现了XPath，但是xalan的org.apache.xpath.XPathAPI 类已经移植到了 JRE 1.5 中，重构为com.sun.org.apache.xpath.internal.XPathAPI。&nbsp; <br />
如果在以前的JDK中，使用含 XPathAPI 类的 jar，例如 xalan-2.4.1.jar。 将该 jar 加入到 CLASSPATH（类路径）。</p>
<p>W3C的DOM标准API非常难用，于是有人开发 Java专用的XML API，这就是jdom=java+DOM。其中一部分人，去开发dom4j，这个不是非常标准，但是速度很快。<br />
使用JDOM隐含服务器风险，因为JBoss和Webphere都是基于JDOM开发的，在这两个服务器下使用JDOM，必须进行相应的设置，而且你的JDOM版本必须与服务器使用的相近，<br />
因为JVM只加载一份相同的类，服务器优先加载自己使用的JDOM，你开发用的JDOM不会被加载，你的应用就会出错。<br />
使用Dom4J隐含工程问题，主要是hibernate，如果你开发的项目和hibernate合并，Dom4J版本不兼容的话，寻找dom4j相同版本hibernate，或者你改程序适应hibernate的Dom4j。<br />
java没有windows的DLL地狱，但是java的jar地狱有过而无不及啊。</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/228540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2008-09-12 11:06 <a href="http://www.blogjava.net/xiaomage234/archive/2008/09/12/228540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.xml.parsers.DocumentBuilderFactory实现类取决逻辑</title><link>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228532.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 12 Sep 2008 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228532.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/228532.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2008/09/12/228532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/228532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/228532.html</trackback:ping><description><![CDATA[<p>sun和ibm都有一套xml的实现，sun的实现是打到jdk里面了。<br />
但当加载的时候，如果ibm的实现jar包xercesImpl.jar的接口 xml-apis.jar [j2ee1.4 library 有]文件导入到classpath 里了的话:<br />
1 如果xml-apis.jar先于 jre加载，那么 将采用 xercesImpl.jar的实现；<br />
2 如果jre先加载，那么将用 sun的xml实现，而取这个实现的类又分别按顺序从4个位置取.</p>
<ul>
    <li>使用 <code>javax.xml.parsers.DocumentBuilderFactory</code> 系统属性。
    <li>使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。此配置文件格式为标准的 <code>java.util.Properties</code> 且包含实现类的完全限定名，其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件，然后缓存其值供以后使用。如果首次尝试读取文件时，文件不存在，则不会再次尝试检查该文件是否存在。首次读取 jaxp.properties 后，其中的属性值不能再更改。
    <li>如果可以，使用 Services API（在 JAR 规范中进行了详细描述）来确定类名称。Services API 将查找在运行时可用的 jar 中 <code>META-INF/services/javax.xml.parsers.DocumentBuilderFactory</code> 文件中的类名。
    <li>平台默认的 <code>DocumentBuilderFactory</code> 实例。</li>
</ul>
<p>这些过程，自己可以通过加vm参数 "-verbose"的方式进行跟踪</p>
 <img src ="http://www.blogjava.net/xiaomage234/aggbug/228532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2008-09-12 10:40 <a href="http://www.blogjava.net/xiaomage234/archive/2008/09/12/228532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java四种XML解析技术介绍</title><link>http://www.blogjava.net/xiaomage234/archive/2007/12/18/168507.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 18 Dec 2007 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2007/12/18/168507.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/168507.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2007/12/18/168507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/168507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/168507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 解析xml的技术众多，都把我搞晕呼了，今天总结了一下，罗列出来，共有四类：dom,jdom,sax,dom4j本人环境jdk5.0 解析目标文件test.xml放在项目的src文件下.&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;&lt;RESULT&gt;　&lt;VALUE&gt;　　&lt;NO&gt...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2007/12/18/168507.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/168507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2007-12-18 15:47 <a href="http://www.blogjava.net/xiaomage234/archive/2007/12/18/168507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>