??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲在线一区二区三区,成在在线免费视频,成年人在线观看网站http://blogjava.net/xiaomage234/category/28214.html生命本就是一ơ凄的漂流Q记忆中放不下的Q永q是孩提时代的那一份浪漫与U真Q?/description>zh-cnFri, 05 Jun 2015 05:29:39 GMTFri, 05 Jun 2015 05:29:39 GMT60mybatis3-mapper dtdhttp://www.aygfsteel.com/xiaomage234/archive/2015/06/05/425510.html马?/dc:creator>马?/author>Fri, 05 Jun 2015 03:36:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2015/06/05/425510.htmlhttp://www.aygfsteel.com/xiaomage234/comments/425510.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2015/06/05/425510.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/425510.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/425510.html<?xml version="1.0" encoding="UTF-8" ?>
<!--
       Copyright 2009-2013 the original author or authors.
       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.
-->
<!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+>
<!ATTLIST mapper
xmlns:fo CDATA #IMPLIED
namespace CDATA #IMPLIED
>
<!ELEMENT cache-ref EMPTY>
<!ATTLIST cache-ref
namespace CDATA #REQUIRED
>
<!ELEMENT cache (property*)>
<!ATTLIST cache
type CDATA #IMPLIED
eviction CDATA #IMPLIED
flushInterval CDATA #IMPLIED
size CDATA #IMPLIED
readOnly CDATA #IMPLIED
blocking CDATA #IMPLIED
>
<!ELEMENT parameterMap (parameter+)?>
<!ATTLIST parameterMap
id CDATA #REQUIRED
type CDATA #REQUIRED
>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
property CDATA #REQUIRED
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
mode (IN | OUT | INOUT) #IMPLIED
resultMap CDATA #IMPLIED
scale CDATA #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST resultMap
id CDATA #REQUIRED
type CDATA #REQUIRED
extends CDATA #IMPLIED
autoMapping (true|false) #IMPLIED
>
<!ELEMENT constructor (idArg*,arg*)>
<!ELEMENT id EMPTY>
<!ATTLIST id
property CDATA #IMPLIED
javaType CDATA #IMPLIED
column CDATA #IMPLIED
jdbcType CDATA #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT result EMPTY>
<!ATTLIST result
property CDATA #IMPLIED
javaType CDATA #IMPLIED
column CDATA #IMPLIED
jdbcType CDATA #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT idArg EMPTY>
<!ATTLIST idArg
javaType CDATA #IMPLIED
column CDATA #IMPLIED
jdbcType CDATA #IMPLIED
typeHandler CDATA #IMPLIED
select CDATA #IMPLIED
resultMap CDATA #IMPLIED
>
<!ELEMENT arg EMPTY>
<!ATTLIST arg
javaType CDATA #IMPLIED
column CDATA #IMPLIED
jdbcType CDATA #IMPLIED
typeHandler CDATA #IMPLIED
select CDATA #IMPLIED
resultMap CDATA #IMPLIED
>
<!ELEMENT collection (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST collection
property CDATA #REQUIRED
column CDATA #IMPLIED
javaType CDATA #IMPLIED
ofType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
select CDATA #IMPLIED
resultMap CDATA #IMPLIED
typeHandler CDATA #IMPLIED
notNullColumn CDATA #IMPLIED
columnPrefix CDATA #IMPLIED
resultSet CDATA #IMPLIED
foreignColumn CDATA #IMPLIED
autoMapping (true|false) #IMPLIED
fetchType (lazy|eager) #IMPLIED
>
<!ELEMENT association (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST association
property CDATA #REQUIRED
column CDATA #IMPLIED
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
select CDATA #IMPLIED
resultMap CDATA #IMPLIED
typeHandler CDATA #IMPLIED
notNullColumn CDATA #IMPLIED
columnPrefix CDATA #IMPLIED
resultSet CDATA #IMPLIED
foreignColumn CDATA #IMPLIED
autoMapping (true|false) #IMPLIED
fetchType (lazy|eager) #IMPLIED
>
<!ELEMENT discriminator (case+)>
<!ATTLIST discriminator
column CDATA #IMPLIED
javaType CDATA #REQUIRED
jdbcType CDATA #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT case (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST case
value CDATA #REQUIRED
resultMap CDATA #IMPLIED
resultType CDATA #IMPLIED
>
<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ELEMENT typeAlias EMPTY>
<!ATTLIST typeAlias
alias CDATA #REQUIRED
type CDATA #REQUIRED
>
<!ELEMENT select (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST select
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterType CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultType CDATA #IMPLIED
resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
fetchSize CDATA #IMPLIED
timeout CDATA #IMPLIED
flushCache (true|false) #IMPLIED
useCache (true|false) #IMPLIED
databaseId CDATA #IMPLIED
lang CDATA #IMPLIED
resultOrdered (true|false) #IMPLIED
resultSets CDATA #IMPLIED 
>
<!ELEMENT insert (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST insert
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterType CDATA #IMPLIED
timeout CDATA #IMPLIED
flushCache (true|false) #IMPLIED
statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
keyProperty CDATA #IMPLIED
useGeneratedKeys (true|false) #IMPLIED
keyColumn CDATA #IMPLIED
databaseId CDATA #IMPLIED
lang CDATA #IMPLIED
>
<!ELEMENT selectKey (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST selectKey
resultType CDATA #IMPLIED
statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
keyProperty CDATA #IMPLIED
keyColumn CDATA #IMPLIED
order (BEFORE|AFTER) #IMPLIED
databaseId CDATA #IMPLIED
>
<!ELEMENT update (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST update
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterType CDATA #IMPLIED
timeout CDATA #IMPLIED
flushCache (true|false) #IMPLIED
statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
keyProperty CDATA #IMPLIED
useGeneratedKeys (true|false) #IMPLIED
keyColumn CDATA #IMPLIED
databaseId CDATA #IMPLIED
lang CDATA #IMPLIED
>
<!ELEMENT delete (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST delete
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterType CDATA #IMPLIED
timeout CDATA #IMPLIED
flushCache (true|false) #IMPLIED
statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
databaseId CDATA #IMPLIED
lang CDATA #IMPLIED
>
<!-- Dynamic -->
<!ELEMENT include (property+)?>
<!ATTLIST include
refid CDATA #REQUIRED
>
<!ELEMENT bind EMPTY>
<!ATTLIST bind
 name CDATA #REQUIRED
 value CDATA #REQUIRED
>
<!ELEMENT sql (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST sql
id CDATA #REQUIRED
lang CDATA #IMPLIED
databaseId CDATA #IMPLIED
>
<!ELEMENT trim (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST trim
prefix CDATA #IMPLIED
prefixOverrides CDATA #IMPLIED
suffix CDATA #IMPLIED
suffixOverrides CDATA #IMPLIED
>
<!ELEMENT where (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ELEMENT set (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST foreach
collection CDATA #REQUIRED
item CDATA #IMPLIED
index CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
separator CDATA #IMPLIED
>
<!ELEMENT choose (when* , otherwise?)>
<!ELEMENT when (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST when
test CDATA #REQUIRED
>
<!ELEMENT otherwise (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ELEMENT if (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!ATTLIST if
test CDATA #REQUIRED
>


]]>
PHP5如何判断RuntimeException,中断E序执行http://www.aygfsteel.com/xiaomage234/archive/2009/03/10/258824.html马?/dc:creator>马?/author>Tue, 10 Mar 2009 08:08:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2009/03/10/258824.htmlhttp://www.aygfsteel.com/xiaomage234/comments/258824.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2009/03/10/258824.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/258824.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/258824.html 比如下面一个解析xml可能遇到的运行时异常Q?br /> try{
 $doc = new DOMDocument();
 $aa = @$doc->load('C:/cinema_data.xml');
 echo $aa;
 if(!$aa){
  throw  new Exception('ocur excep');
 }
 echo 'ccc';
}catch(Exception $e){
 //echo $e->getTrace();
 echo 'bbb';
 exit;
}

可以看到Q发生异常时Qecho 'ccc'是没执行的?

]]>
?PHP d和编?XML DOM [摘]http://www.aygfsteel.com/xiaomage234/archive/2009/03/09/258595.html马?/dc:creator>马?/author>Mon, 09 Mar 2009 06:43:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2009/03/09/258595.htmlhttp://www.aygfsteel.com/xiaomage234/comments/258595.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2009/03/09/258595.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/258595.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/258595.html

使用 DOM 库、SAX 解析器和正则表达?/em>

developerWorks
文档选项

U别Q?中

Jack Herrington (jack_d_herrington@codegeneration.net), 高软g工程? "Code Generation Network"

2006 q?2 ?06 ?/p>

有许多技术可用于?PHP d和编?XML。本文提供了三种Ҏd XMLQ?DOM 库、?SAX 解析器和使用正则表达式。还介绍了?DOM ?PHP 文本模板~写 XML?/blockquote>

?PHP d和编写可扩展标记语言QXMLQ看h可能有点恐怖。实际上QXML 和它的所有相x术可能是恐怖的Q但是用 PHP d和编?XML 不一定是Ҏ怖的d。首先,需要学习一点关?XML 的知?—?它是什么,用它做什么。然后,需要学习如何用 PHP d和编?XMLQ而有许多U方式可以做qg事?/p>

本文提供?XML 的简短入门,然后解释如何?PHP d和编?XML?/p>

什么是 XMLQ?/span>

XML 是一U数据存储格式。它没有定义保存什么数据,也没有定义数据的格式。XML 只是定义了标记和q些标记的属性。格式良好的 XML 标记看v来像q样Q?/p>

<name>Jack Herrington</name>

q个 <name> 标记包含一些文本:Jack Herrington?/p>

不包含文本的 XML 标记看v来像q样Q?/p>

<powerUp />

?XML Ҏ件事q行~写的方式不止一U。例如,q个标记形成的输Z前一个标记相同:

<powerUp></powerUp>

也可以向 XML 标记d属性。例如,q个 <name> 标记包含 first ?last 属性:

<name first="Jack" last="Herrington" />

也可以用 XML 对特D字W进行编码。例如,& W号可以像这L码:

&

包含标记和属性的 XML 文g如果像示例一h式化Q就?em>格式良好?/em>Q这意味着标记是对U的Q字W的~码正确。清?1 是一份格式良好的 XML 的示例?/p>
清单 1. XML 图书列表CZ
  <books>
                        <book>
                        <author>Jack Herrington</author>
                        <title>PHP Hacks</title>
                        <publisher>O'Reilly</publisher>
                        </book>
                        <book>
                        <author>Jack Herrington</author>
                        <title>Podcasting Hacks</title>
                        <publisher>O'Reilly</publisher>
                        </book>
                        </books>
                        

清单 1 中的 XML 包含一个图书列表。父标记 <books> 包含一l?<book> 标记Q每?<book> 标记又包?<author>?code><title> ?<publisher> 标记?/p>

?XML 文档的标记结构和内容得到外部模式文g的验证后QXML 文档是正确的。模式文件可以用不同的格式指定。对于本文来_所需要的只是格式良好?XML?/p>

如果觉得 XML 看v来很像超文本标记语言QHTMLQ,那么对了。XML ?HTML 都是Z标记的语aQ它们有许多怼之处。但是,要着重指出的是:虽然 XML 文档可能是格式良好的 HTMLQ但不是所有的 HTML 文档都是格式良好?XML。换行标讎ͼbrQ是 XML ?HTML 之间区别的一个好例子。这个换行标记是格式良好?HTMLQ但不是格式良好?XMLQ?/p> <p>This is a paragraph<br>
With a line break</p>

q个换行标记是格式良好的 XML ?HTMLQ?/p> <p>This is a paragraph<br />
With a line break</p>

如果要把 HTML ~写成同h格式良好?XMLQ请遵@ W3C 委员会的可扩展超文本标记语言QXHTMLQ标准(参见 参考资?/a>Q。所有现代的览器都能呈?XHTML。而且Q还可以?XML 工具d XHTML q找出文档中的数据,q比解析 HTML Ҏ得多?/p>



回页?/strong>


使用 DOM 库读?XML

d格式良好?XML 文g最Ҏ的方式是使用~译成某?PHP 安装的文档对象模?QDOMQ库。DOM 库把整个 XML 文档d内存Qƈ用节Ҏ表示它,如图 1 所C?/p>
?1. 图书 XML ?XML DOM ?/strong>
图书 XML ?XML DOM ? src=

树顶部的 books 节点有两?book 子标记。在每本书中Q有 author?code>publisher ?title 几个节点?code>author?code>publisher ?title 节点分别有包含文本的文本子节炏V?/p>

d图书 XML 文gq用 DOM 昄内容的代码如清单 2 所C?/p>
清单 2. ?DOM d图书 XML
  <?php
                        $doc = new DOMDocument();
                        $doc->load( 'books.xml' );
                        $books = $doc->getElementsByTagName( "book" );
                        foreach( $books as $book )
                        {
                        $authors = $book->getElementsByTagName( "author" );
                        $author = $authors->item(0)->nodeValue;
                        $publishers = $book->getElementsByTagName( "publisher" );
                        $publisher = $publishers->item(0)->nodeValue;
                        $titles = $book->getElementsByTagName( "title" );
                        $title = $titles->item(0)->nodeValue;
                        echo "$title - $author - $publisher\n";
                        }
                        ?>
                        

脚本首先创徏一?new DOMdocument 对象Q用 load Ҏ把图?XML 装入q个对象。之后,脚本?getElementsByName Ҏ得到指定名称下的所有元素的列表?/p>

?book 节点的@环中Q脚本用 getElementsByName Ҏ获得 author?code>publisher ?title 标记?nodeValue?code>nodeValue 是节点中的文本。脚本然后显C些倹{?/p>

可以在命令行上像q样q行 PHP 脚本Q?/p> % php e1.php
PHP Hacks - Jack Herrington - O'Reilly
Podcasting Hacks - Jack Herrington - O'Reilly
%

可以看到Q每个图书块输出一行。这是一个良好的开始。但是,如果不能讉K XML DOM 库该怎么办?





回页?/strong>


?SAX 解析器读?XML

d XML 的另一U方法是使用 XML Simple APIQSAXQ解析器。PHP 的大多数安装都包?SAX 解析器。SAX 解析器运行在回调模型上。每ơ打开或关闭一个标记时Q或者每ơ解析器看到文本Ӟq节点或文本的信息回调用户定义的函数?/p>

SAX 解析器的优点是,它是真正轻量U的。解析器不会在内存中长期保持内容Q所以可以用于非常巨大的文g。缺Ҏ~写 SAX 解析器回调是仉帔R烦的事。清?3 昄了?SAX d图书 XML 文gq显C内容的代码?/p>
清单 3. ?SAX 解析器读取图?XML
  <?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";
                        }
                        ?>
                        

脚本首先讄 g_books 数组Q它在内存中容纳所有图书和图书信息Q?code>g_elem 变量保存脚本目前正在处理的标记的名称。然后脚本定义回调函数。在q个CZ中,回调函数?startElement?code>endElement ?textData。在打开和关闭标记的时候,分别调用 startElement ?endElement 函数。在开始和l束标记之间的文本上面,调用 textData?/p>

在这个示例中Q?code>startElement 标记查找 book 标记Q在 book 数组中开始一个新元素。然后,textData 函数查看当前元素Q看它是不是 publisher?code>title ?author 标记。如果是Q函数就把当前文本放入当前图书?/p>

Z让解析l,脚本?xml_parser_create 函数创徏解析器。然后,讄回调句柄。之后,脚本d文gq把文g的大块内容发送到解析器。在文gd之后Q?code>xml_parser_free 函数删除解析器。脚本的末尾输出 g_books 数组的内宏V?/p>

可以看到Q这比编?DOM 的同样功能要困难得多。如果没?DOM 库也没有 SAX 库该怎么办?q有替代Ҏ么?





回页?/strong>


用正则表辑ּ解析 XML

可以肯定Q即使提到这个方法,有些工程师也会批评我Q但是确实可以用正则表达式解?XML。清?4 昄了?preg_ 函数d图书文g的示例?/p>
清单 4. 用正则表辑ּd XML
  <?php
                        $xml = "";
                        $f = fopen( 'books.xml', 'r' );
                        while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
                        fclose( $f );
                        preg_match_all( "/\<book\>(.*?)\<\/book\>/s",
                        $xml, $bookblocks );
                        foreach( $bookblocks[1] as $block )
                        {
                        preg_match_all( "/\<author\>(.*?)\<\/author\>/",
                        $block, $author );
                        preg_match_all( "/\<title\>(.*?)\<\/title\>/",
                        $block, $title );
                        preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/",
                        $block, $publisher );
                        echo( $title[1][0]." - ".$author[1][0]." - ".
                        $publisher[1][0]."\n" );
                        }
                        ?>
                        

h意这个代码有多短。开始时Q它把文件读q一个大的字W串。然后用一?regex 函数d每个图书目。最后用 foreach 循环Q在每个图书块间循环Qƈ提取?author、title ?publisher?/p>

那么Q缺陷在哪呢Q用正则表辑ּ代码d XML 的问题是Q它q没先进行检查,保 XML 的格式良好。这意味着在读取之前,无法知道 XML 是否格式良好。而且Q有些格式正的 XML 可能与正则表辑ּ不匹配,所以日后必M改它们?/p>

我从不徏议用正则表辑ּd XMLQ但是有时它是兼Ҏ最好的方式Q因为正则表辑ּ函数L可用的。不要用正则表达式读取直接来自用L XMLQ因为无法控制这c?XML 的格式或l构。应当一直用 DOM 库或 SAX 解析器读取来自用L XML?/p>



回页?/strong>


?DOM ~写 XML

d XML 只是公式的一部分。该怎样~写 XML 呢?~写 XML 最好的方式是?DOM。清?5 昄?DOM 构徏图书 XML 文g的方式?/p>
清单 5. ?DOM ~写图书 XML
  <?php
                        $books = array();
                        $books [] = array(
                        'title' => 'PHP Hacks',
                        'author' => 'Jack Herrington',
                        'publisher' => "O'Reilly"
                        );
                        $books [] = array(
                        'title' => 'Podcasting Hacks',
                        'author' => 'Jack Herrington',
                        'publisher' => "O'Reilly"
                        );
                        $doc = new DOMDocument();
                        $doc->formatOutput = true;
                        $r = $doc->createElement( "books" );
                        $doc->appendChild( $r );
                        foreach( $books as $book )
                        {
                        $b = $doc->createElement( "book" );
                        $author = $doc->createElement( "author" );
                        $author->appendChild(
                        $doc->createTextNode( $book['author'] )
                        );
                        $b->appendChild( $author );
                        $title = $doc->createElement( "title" );
                        $title->appendChild(
                        $doc->createTextNode( $book['title'] )
                        );
                        $b->appendChild( $title );
                        $publisher = $doc->createElement( "publisher" );
                        $publisher->appendChild(
                        $doc->createTextNode( $book['publisher'] )
                        );
                        $b->appendChild( $publisher );
                        $r->appendChild( $b );
                        }
                        echo $doc->saveXML();
                        ?>
                        

在脚本的剙Q用一些示例图书装入了 books 数组。这个数据可以来自用户也可以来自数据库?/p>

CZ图书装入之后Q脚本创Z?new DOMDocumentQƈ把根节点 books d到它。然后脚本ؓ每本书的 author、title ?publisher 创徏节点Qƈ为每个节Ҏ加文本节炏V每?book 节点的最后一步是重新把它d到根节点 books?/p>

脚本的末 saveXML Ҏ?XML 输出到控制台。(也可以用 save Ҏ创徏一?XML 文g。)脚本的输出如清单 6 所C?/p>
清单 6. DOM 构徏脚本的输?/strong>
  % php e4.php
                        <?xml version="1.0"?>
                        <books>
                        <book>
                        <author>Jack Herrington</author>
                        <title>PHP Hacks</title>
                        <publisher>O'Reilly</publisher>
                        </book>
                        <book>
                        <author>Jack Herrington</author>
                        <title>Podcasting Hacks</title>
                        <publisher>O'Reilly</publisher>
                        </book>
                        </books>
                        %
                        

使用 DOM 的真正h值在于它创徏?XML L格式正确的。但是如果不能用 DOM 创徏 XML 时该怎么办?





回页?/strong>


?PHP ~写 XML

如果 DOM 不可用,可以?PHP 的文本模板编?XML。清?7 昄?PHP 如何构徏图书 XML 文g?/p>
清单 7. ?PHP ~写图书 XML
  <?php
                        $books = array();
                        $books [] = array(
                        'title' => 'PHP Hacks',
                        'author' => 'Jack Herrington',
                        'publisher' => "O'Reilly"
                        );
                        $books [] = array(
                        'title' => 'Podcasting Hacks',
                        'author' => 'Jack Herrington',
                        'publisher' => "O'Reilly"
                        );
                        ?>
                        <books>
                        <?php
                        foreach( $books as $book )
                        {
                        ?>
                        <book>
                        <title><?php echo( $book['title'] ); ?></title>
                        <author><?php echo( $book['author'] ); ?>
                        </author>
                        <publisher><?php echo( $book['publisher'] ); ?>
                        </publisher>
                        </book>
                        <?php
                        }
                        ?>
                        </books>
                        

脚本的顶部与 DOM 脚本cM。脚本的底部打开 books 标记Q然后在每个图书中P代,创徏 book 标记和所有的内部 title?code>author ?publisher 标记?/p>

q种Ҏ的问题是对实体进行编码。ؓ了确保实体编码正,必须在每个项目上调用 htmlentities 函数Q如清单 8 所C?/p>
清单 8. 使用 htmlentities 函数对实体编?/strong>
                        <books>
                        <?php
                        foreach( $books as $book )
                        {
                        $title = htmlentities( $book['title'], ENT_QUOTES );
                        $author = htmlentities( $book['author'], ENT_QUOTES );
                        $publisher = htmlentities( $book['publisher'], ENT_QUOTES );
                        ?>
                        <book>
                        <title><?php echo( $title ); ?></title>
                        <author><?php echo( $author ); ?> </author>
                        <publisher><?php echo( $publisher ); ?>
                        </publisher>
                        </book>
                        <?php
                        }
                        ?>
                        </books>
                        

q就是用基本?PHP ~写 XML 的烦Z处。您以ؓ自己创徏了完的 XMLQ但是在试图使用数据的时候,马上׃发现某些元素的编码不正确?/p>



回页?/strong>


l束?/span>

XML 周围L许多夸大之处和؜淆之处。但是,q不像您惛_的那么难 —?特别是在 PHP q样优秀的语a中。在理解q正地实现?XML 之后Q就会发现有许多强大的工具可以用。XPath ?XSLT 是q样两个值得研究的工兗?/p>

参考资?

学习

获得产品和技?/strong>
  • 误?PHP.netQ了解关?PHP 的最新新闅R找C载,q向其他用户学习?br />
  • 了解 Expat XML ParserQ这个解析器用来?PHP 提供 SAX 解析器功能?br />
  • 利用 IBM 试用软g 攚w您的下一个开放源码开发项目,可以下蝲也可以通过 DVD 得到?br />

讨论


关于作?/span>

 

Jack D. Herrington 是有 20 多年l验的高UY件工E师。他是三本书的作者:Code Generation in Action?em>Podcasting Hacks 和即发表的 PHP Hacks。他q撰写了 30 多篇文章?/p>



]]>
[转]XML api折射出sun与IBM的恩?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/xiaomage234/archive/2008/09/12/228540.html</guid><wfw:comment>http://www.aygfsteel.com/xiaomage234/comments/228540.html</wfw:comment><comments>http://www.aygfsteel.com/xiaomage234/archive/2008/09/12/228540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xiaomage234/comments/commentRss/228540.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xiaomage234/services/trackbacks/228540.html</trackback:ping><description><![CDATA[<p>最初的xml解析器是sun的Crimson和IBM的XercesQ这两个开源项目都捐给了apachel织Q后来Xerces发展很快QCrimon基本没有Z用?br /> 1.4 版本P用于 XML 处理?Java API 已l加入了Java 2 q_中?利用?APIQ可通过一pd标准?Java q_ API 来处?XML 文档?br />  因此Q也无需另外d XML 处理包了。sun的JDK1.4使用CrimsonQIBM的JDK使用Xerces?br /> 如果打算把sun 的jdkE序UL到IBM的JDK下,注意解析器不同,XML处理会出问题。这p明了java不是“一ơ编译,到处q行”Q而是“一ơ编译,到处调试”?br /> 如果你把IBM的JDKUL到SUN的JDK下,即把Xerces包引入CLASSPATHQJDKq是使用CrimsonQ不信你q行java -verbose试一试?br /> 解决的办法就是在在JRE\lib\目录下,建立一个jaxp.properties的文Ӟ<br /> 内容如下Q?br />     javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl<br />     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 /> 最lsunq是指定JAXP规范QJSR 206 Java API for XML Processing(JAXP) 1.3Q他已经由JDK1.5实现?br /> JAXP实现了XPathQ但是xalan的org.apache.xpath.XPathAPI cdl移植到?JRE 1.5 中,重构为com.sun.org.apache.xpath.internal.XPathAPI?nbsp; <br /> 如果在以前的JDK中,使用?XPathAPI cȝ jarQ例?xalan-2.4.1.jar?该 jar 加入?CLASSPATHQ类路径Q?/p> <p>W3C的DOM标准API非常隄Q于是有人开?Java专用的XML APIQ这是jdom=java+DOM。其中一部分人,d发dom4jQ这个不是非常标准,但是速度很快?br /> 使用JDOM隐含服务器风险,因ؓJBoss和Webphere都是ZJDOM开发的Q在q两个服务器下用JDOMQ必进行相应的讄Q而且你的JDOM版本必须与服务器使用的相q,<br /> 因ؓJVM只加载一份相同的c,服务器优先加载自׃用的JDOMQ你开发用的JDOM不会被加载,你的应用׃出错?br /> 使用Dom4J隐含工程问题Q主要是hibernateQ如果你开发的目和hibernate合ƈQDom4J版本不兼容的话,Ldom4j相同版本hibernateQ或者你改程序适应hibernate的Dom4j?br /> java没有windows的DLL地狱Q但是java的jar地狱有过而无不及啊?/p> <img src ="http://www.aygfsteel.com/xiaomage234/aggbug/228540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xiaomage234/" target="_blank">马?/a> 2008-09-12 11:06 <a href="http://www.aygfsteel.com/xiaomage234/archive/2008/09/12/228540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.xml.parsers.DocumentBuilderFactory实现cd决逻辑http://www.aygfsteel.com/xiaomage234/archive/2008/09/12/228532.html马?/dc:creator>马?/author>Fri, 12 Sep 2008 02:40:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2008/09/12/228532.htmlhttp://www.aygfsteel.com/xiaomage234/comments/228532.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2008/09/12/228532.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/228532.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/228532.htmlsun和ibm都有一套xml的实玎ͼsun的实现是打到jdk里面了?br /> 但当加蝲的时候,如果ibm的实现jar包xercesImpl.jar的接?xml-apis.jar [j2ee1.4 library 有]文g导入到classpath 里了的话:
1 如果xml-apis.jar先于 jre加蝲Q那?采?xercesImpl.jar的实玎ͼ
2 如果jre先加载,那么用 sun的xml实现Q而取q个实现的类又分别按序?个位|取.

  • 使用 javax.xml.parsers.DocumentBuilderFactory pȝ属性?
  • 使用 JRE 文g夹中的属性文?"lib/jaxp.properties"。此配置文g格式为标准的 java.util.Properties 且包含实现类的完全限定名Q其中实现类的键是上q定义的pȝ属性?JAXP 实现只读取一?jaxp.properties 文gQ然后缓存其g以后使用。如果首ơ尝试读取文件时Q文件不存在Q则不会再次试查该文g是否存在。首ơ读?jaxp.properties 后,其中的属性g能再更改?
  • 如果可以Q?Services APIQ在 JAR 规范中进行了详细描述Q来定cdU。Services API 查扑֜q行时可用的 jar ?META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文g中的cd?
  • q_默认?DocumentBuilderFactory 实例?/li>

q些q程Q自己可以通过加vm参数 "-verbose"的方式进行跟t?/p>

]]>
Java四种XML解析技术介l?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/xiaomage234/archive/2007/12/18/168507.html</guid><wfw:comment>http://www.aygfsteel.com/xiaomage234/comments/168507.html</wfw:comment><comments>http://www.aygfsteel.com/xiaomage234/archive/2007/12/18/168507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xiaomage234/comments/commentRss/168507.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xiaomage234/services/trackbacks/168507.html</trackback:ping><description><![CDATA[     摘要: 解析xml的技术众多,都把我搞晕呼了,今天ȝ了一下,|列出来Q共有四c: dom,jdom,sax,dom4j 本h环境jdk5.0 解析目标文gtest.xml攑֜目的src文g? <?xml version="1.0" encoding="GB2312"?> <RESULT>  <VALUE>   <NO>...  <a href='http://www.aygfsteel.com/xiaomage234/archive/2007/12/18/168507.html'>阅读全文</a><img src ="http://www.aygfsteel.com/xiaomage234/aggbug/168507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xiaomage234/" target="_blank">马?/a> 2007-12-18 15:47 <a href="http://www.aygfsteel.com/xiaomage234/archive/2007/12/18/168507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ֱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ղ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">¡Ң</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӣ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">گ</a>| <a href="http://" target="_blank">ȷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Т</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƥɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¬</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">¯</a>| <a href="http://" target="_blank">ƽ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>