﻿<?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-liuzheng-文章分类-XML</title><link>http://www.blogjava.net/liuzheng/category/27327.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 09 Jan 2008 01:31:10 GMT</lastBuildDate><pubDate>Wed, 09 Jan 2008 01:31:10 GMT</pubDate><ttl>60</ttl><item><title>XML 中CDATA的意义</title><link>http://www.blogjava.net/liuzheng/articles/173635.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 08 Jan 2008 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/173635.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/173635.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/173635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/173635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/173635.html</trackback:ping><description><![CDATA[<h2>解析数据</h2>
<p><strong>XML 解析器通常情况下会处理XML文档中的所有文本。</strong></p>
<p>当XML元素被解析的时候，XML元素内部的文本也会被解析:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;message&gt;This text is also parsed&lt;/message&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>XML解析器这样做的原因是XML元素内部可能还包含了别的元素，象下面的例子，name元素内部包含了first和last两个元素:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;name&gt;&lt;first&gt;Bill&lt;/first&gt;&lt;last&gt;Gates&lt;/last&gt;&lt;/name&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>解析器会认为上面的代码是这样的:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;name&gt;
            &lt;first&gt;Bill&lt;/first&gt;
            &lt;last&gt;Gates&lt;/last&gt;
            &lt;/name&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<hr />
<h2>转义字符</h2>
<p><strong>不合法的XML字符必须被替换为相应的实体。 </strong></p>
<p>如果在XML文档中使用类似"<font color="#ff0000">&lt;</font>" 的字符, 那么解析器将会出现错误，因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;message&gt;if salary &lt; 1000 then&lt;/message&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>为了避免出现这种情况，必须将字符"&lt;" 转换成实体，象下面这样:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;message&gt;if salary <font color="#ff0000">&amp;lt;</font> 1000 then&lt;/message&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>下面是五个在XML文档中预定义好的实体:</p>
<table class="ex" cellspacing="0" width="50%" border="1">
    <tbody>
        <tr>
            <td width="39%">&amp;lt;</td>
            <td width="17%">&lt;</td>
            <td width="44%">小于号</td>
        </tr>
        <tr>
            <td>&amp;gt;</td>
            <td>&gt;</td>
            <td>大于号</td>
        </tr>
        <tr>
            <td>&amp;amp;</td>
            <td>&amp;</td>
            <td>和</td>
        </tr>
        <tr>
            <td>&amp;apos;</td>
            <td>'</td>
            <td>单引号</td>
        </tr>
        <tr>
            <td>&amp;quot;</td>
            <td>"</td>
            <td>双引号</td>
        </tr>
    </tbody>
</table>
<br />
实体必须以符号"&amp;"开头，以符号";"结尾<strong>。</strong>
<p><strong>注意:</strong> 只有"&lt;" 字符和"&amp;"字符对于XML来说是严格禁止使用的。剩下的都是合法的，为了减少出错，使用实体是一个好习惯。</p>
<hr />
<h2>CDATA部件</h2>
<p><strong>在CDATA内部的所有内容都会被解析器忽略。</strong></p>
<p>如果文本包含了很多的"&lt;"字符和"&amp;"字符——就象程序代码一样，那么最好把他们都放到CDATA部件中。</p>
<p>一个 CDATA 部件以"<strong><font color="#ff0000">&lt;![CDATA[</font></strong>" 标记开始，以"<strong><font color="#ff0000">]]&gt;</font></strong>"标记结束:</p>
<table class="ex" cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <pre>&lt;script&gt;
            <font color="#0000ff">&lt;![CDATA[</font>
            function matchwo(a,b)
            {
            if (a &lt; b &amp;&amp; a &lt; 0) then
            {
            return 1
            }
            else
            {
            return 0
            }
            }
            <font color="#0000ff">]]&gt;</font>
            &lt;/script&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>在前面的例子中，所有在CDATA部件之间的文本都会被解析器忽略。</p>
<h3>CDATA注意事项:</h3>
<p>CDATA部件之间不能再包含CDATA部件（不能嵌套）。如果CDATA部件包含了字符"<font color="#ff0000">]]&gt;</font>" 或者"<font color="#ff0000">&lt;![CDATA[</font>" ，将很有可能出错哦。</p>
<p>同样要注意在字符串"<font color="#ff0000">]]&gt;</font>"之间没有空格或者换行符。</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/173635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2008-01-08 14:49 <a href="http://www.blogjava.net/liuzheng/articles/173635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML schema 中 elementFormDefault 的意义</title><link>http://www.blogjava.net/liuzheng/articles/170916.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 27 Dec 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/170916.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/170916.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/170916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/170916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/170916.html</trackback:ping><description><![CDATA[一个&nbsp;XML&nbsp;schema&nbsp;中&nbsp;elementFormDefault="？"&nbsp;这一属性用来指示&nbsp;XML&nbsp;Schema&nbsp;处理程序把这个&nbsp;XML&nbsp;schema&nbsp;中定义的元素或者类型放到哪个命名空间。
<p>&nbsp;</p>
<p>一个schema中声明的元素或者类型只能归到两个命名空间中的某一个去，这两个是，无名命名空间和由targetSchema属性指明的目标命名空间。而targetSchema属性只能在xs：schema的定义中声明，因而，一个schema中的定义的元素或类型只可能归属于一个有名命名空间（但是还有可能归属于无名命名空间）。</p>
<p>当elementFormDefault="qualified"&nbsp;时，所有全局元素的子元素将被以缺省方式放到目标命名空间，但是全局元素或者类型将被放到目标命名空间；而当elementFormDefault="unqualified"&nbsp;时，所有全局元素的子元素将被以缺省方式放到无名命名空间。而属性的命名空间类似地由attributeFormDefault="？"来指明。</p>
<p>需要明白的是，elementFormDefault="？"&nbsp;是有作用域的，并且是被继承的，除非在子定义中覆盖父定义。</p>
<p>下面三个例子说明了elementFormDefault的使用效果。红色表示属于已命名空间的元素，蓝色表示属于未命名空间的元素。</p>
<p>1.定义了目标命名空间，&nbsp;全局elementFormDefault=&#8220;unqualified&#8221;。这时除了全局元素或者类型将归于目标命名空间外，局部元素将归于无名命名空间。</p>
<p><u>unqualified.xsd</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
&lt;xs:schema&nbsp;xmlns:xs="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema"'>http://www.w3.org/2001/XMLSchema"</a>&nbsp;<font color="red">targetNamespace="aaaa"&nbsp;elementFormDefault="unqualified"</font>&nbsp;attributeFormDefault="unqualified"&gt;<br />
&nbsp;&lt;xs:element&nbsp;name="c"&gt;<br />
&nbsp;&nbsp;&lt;xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c1"&nbsp;type="xs:double"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c2"&nbsp;type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&lt;/xs:complexType&gt;<br />
&nbsp;&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;</p>
<p><u>unqualified.xml</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
<font color="red">&lt;n:c&nbsp;xmlns:n="aaaa"</font>&nbsp;xmlns:xsi="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema-instance"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a>&nbsp;xsi:schemaLocation="aaaa&nbsp;unqualified.xsd"&gt;<br />
&nbsp;<font color="blue">&lt;c1&gt;</font>3.141593E0<font color="blue">&lt;/c1&gt;</font><br />
&nbsp;<font color="blue">&lt;c2&gt;</font>String<font color="blue">&lt;/c2&gt;</font><br />
<font color="red">&lt;/n:c&gt;</font></p>
<p>2.&nbsp;定义了目标命名空间，&nbsp;全局elementFormDefault=&#8220;qualified&#8221;。这时全局元素或者类型将归于目标命名空间，局部元素将以缺省方式归于目标命名空间。</p>
<p><u>qualified.xsd</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
&lt;xs:schema&nbsp;xmlns:xs="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema"'>http://www.w3.org/2001/XMLSchema"</a>&nbsp;<font color="red">targetNamespace="aaaa"&nbsp;elementFormDefault="qualified"</font>&nbsp;attributeFormDefault="unqualified"&gt;<br />
&nbsp;&lt;xs:element&nbsp;name="c"&gt;<br />
&nbsp;&nbsp;&lt;xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c1"&nbsp;type="xs:double"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c2"&nbsp;type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&lt;/xs:complexType&gt;<br />
&nbsp;&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;</p>
<p><u>qualified.xml</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
<font color="red">&lt;c&nbsp;xmlns="aaaa"</font>&nbsp;xmlns:xsi="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema-instance"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a>&nbsp;xsi:schemaLocation="aaaa&nbsp;qualified.xsd"&gt;<br />
&nbsp;<font color="red">&lt;c1&gt;</font>3.141593E0<font color="red">&lt;/c1&gt;</font><br />
&nbsp;<font color="red">&lt;c2&gt;</font>String<font color="red">&lt;/c2&gt;</font><br />
<font color="red">&lt;/c&gt;</font></p>
<p>3.&nbsp;定义了目标命名空间，&nbsp;全局elementFormDefault=&#8220;unqualified&#8221;。这时全局元素（c）或者类型将归于目标命名空间。局部元素（c1，c2）以缺省方式归于无名命名空间。局部元素（c3）在局部定义中使用form=&#8220;qualified&#8221;覆盖全局设定的unqualified，这使得c3归于目标命名空间（如果它有子元素，子元素将以缺省方式归于目标命名空间）。</p>
<p><u>qualified2.xsd</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
&lt;xs:schema&nbsp;xmlns:xs="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema"'>http://www.w3.org/2001/XMLSchema"</a>&nbsp;<font color="red">targetNamespace="aaaa"&nbsp;elementFormDefault="unqualified"</font>&nbsp;attributeFormDefault="unqualified"&gt;<br />
&nbsp;&lt;xs:element&nbsp;name="c"&gt;<br />
&nbsp;&nbsp;&lt;xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c1"&nbsp;type="xs:double"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c2"&nbsp;type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="c3"&nbsp;type="xs:integer"&nbsp;<font color="red">form="qualified"</font>/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&lt;/xs:complexType&gt;<br />
&nbsp;&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;</p>
<p><br />
<u>qualified2.xml</u></p>
<p>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
<font color="red">&lt;n:c&nbsp;xmlns:n="aaaa"</font>&nbsp;xmlns:xsi="<a class="contentlink" href='http://www.w3.org/2001/XMLSchema-instance"' target="_blank" href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a>&nbsp;xsi:schemaLocation="aaaa&nbsp;qualified2.xsd"&gt;<br />
&nbsp;<font color="blue">&lt;c1&gt;</font>3.141593E0<font color="blue">&lt;/c1&gt;</font><br />
&nbsp;<font color="blue">&lt;c2&gt;</font>String<font color="blue">&lt;/c2&gt;</font><br />
&nbsp;<font color="red">&lt;n:c3&gt;</font>0<font color="red">&lt;/n:c3&gt;</font><br />
<font color="red">&lt;/n:c&gt;</font></p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/170916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-12-27 16:29 <a href="http://www.blogjava.net/liuzheng/articles/170916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSDL for sample</title><link>http://www.blogjava.net/liuzheng/articles/167163.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Wed, 12 Dec 2007 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/167163.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/167163.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/167163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/167163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/167163.html</trackback:ping><description><![CDATA[<h2>WSDL Example</h2>
<p>This is a simplified fraction of a WSDL document:</p>
<table border="1" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre>&lt;message name="getTermRequest"&gt;<br />
            &lt;part name="term" type="xs:string"/&gt;<br />
            &lt;/message&gt;<br />
            <br />
            &lt;message name="getTermResponse"&gt;<br />
            &lt;part name="value" type="xs:string"/&gt;<br />
            &lt;/message&gt;</pre>
            <pre>&lt;portType name="glossaryTerms"&gt;<br />
            &lt;operation name="getTerm"&gt;<br />
            &lt;input message="getTermRequest"/&gt;<br />
            &lt;output message="getTermResponse"/&gt;<br />
            &lt;/operation&gt;<br />
            &lt;/portType&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>In this example the<strong> &lt;portType&gt;</strong> element defines "glossaryTerms"
as the name of a <strong>port</strong>, and "getTerm"
as the name of an <strong>operation</strong>.</p>
<p>The "getTerm" operation has an <strong>input message</strong> called "getTermRequest"
and an <strong>output message</strong> called "getTermResponse".</p>
<p>The<strong> &lt;message&gt;</strong> elements define the <strong>parts</strong> of each message and
the associated data types.</p>
<p>Compared to traditional programming, glossaryTerms is a function library, "getTerm"
is a function with "getTermRequest" as the input parameter and getTermResponse as
the return parameter.</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/167163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-12-12 10:47 <a href="http://www.blogjava.net/liuzheng/articles/167163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用stax解析xml</title><link>http://www.blogjava.net/liuzheng/articles/165121.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 04 Dec 2007 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/165121.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/165121.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/165121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/165121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/165121.html</trackback:ping><description><![CDATA[<p><a name="N101C1"><span class="smalltitle">StAX 框架（Streaming API for XML）</span></a></p>
<p>SAX 框架的缺点是不能记录正在处理元素的上下文。但是优点是运行时占内存空间比较小，效率高。DOM 框架由于在处理 XML 时需要为其构造一棵树，所以特点正好相反。StAX 框架出现于 Java SE 6 中，它的设计目标就是要结合 SAX 框架和 DOM 框架的优点。既要求运行时效率，也要求保持元素的上下文状态。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse67/index.html#listing5">清单 5</a> 是一段使用 StAX 框架处理 XML 文件的代码。</p>
<br />
<a name="listing5"><strong>清单 5. 使用 StAX 框架处理 XML 文件</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import java.io.*;
            import javax.xml.stream.*;
            import javax.xml.stream.events.*;
            public class StAXTest {
            public static void main(String[] args) {
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            InputStream input = new ByteArrayInputStream(
            ("&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;" +
            "&lt;work-contact-info&gt;" +
            "&lt;Location&gt;Shanghai-shuion-333&lt;/Location&gt;" +
            "&lt;Postal&gt;200020&lt;/Postal&gt;" +
            "&lt;Tel&gt;&lt;fix&gt;63262299&lt;/fix&gt;&lt;mobile&gt;1581344454&lt;/mobile&gt;&lt;/Tel&gt;" +
            "&lt;Appellation&gt;Mr. Wang&lt;/Appellation&gt;" +
            "&lt;/work-contact-info&gt;").getBytes());
            try {
            XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
            while (xmlEventReader.hasNext()) {
            XMLEvent event = xmlEventReader.nextEvent();
            if (event.isStartElement()) {
            StartElement startElement = event.asStartElement();
            System.out.println(startElement.getName().toString());
            }
            if (event.isCharacters()) {
            Characters text = event.asCharacters();
            if (!text.isWhiteSpace()) {
            System.out.println("\t" + text.getData());
            }
            }
            }
            } catch (XMLStreamException e) {
            e.printStackTrace();
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>观察后可以发现 StAX 框架和 SAX 框架具有相似的地方。StAX 有 <code>Event.isStartElement</code> 方法，SAX 有 <code>DefaultHandler.startElement</code> 方法。StAX 有 <code>Event.isCharacter</code> 方法，SAX 有 <code>DefaultHandler.character</code> 方法。实际上这两个框架处理 XML 文件的时候使用了相似的模型——将 XML 文件作为元素组成的流，而不同于 DOM 的树模型。解析 XML 文件时，应用程序调用 <code>XMLEventReader</code> 的 <code>nextEvent</code> 方法解析下一个元素（或者是解析同一个元素，根据解析的不同阶段，产生不同元素），StAX 就会通过 <code>XMLEventReader</code> 产生一个事件。比如针对同一个元素，可能会产生 <code>StartElement</code> 和 <code>EndElement</code> 事件。形象的说 <code>XMLEventReader</code> 就像是一根绳子，拽一下，解析一个元素，产生一个事件。于是这种技术也被称为&#8221;Pull Parser&#8221;技术。StAX 在处理 XML 文件时，产生的所有事件是通过一个 <code>Iterator</code>（<code>XMLEventReader</code> 继承了 <code>Iterator</code>）返回的。应用程序通过这个 <code>Iterator</code> 能知道某个解析事件的前后分别是什么。这类信息就是一个元素的上下文信息。</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/165121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-12-04 11:43 <a href="http://www.blogjava.net/liuzheng/articles/165121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习xml心得</title><link>http://www.blogjava.net/liuzheng/articles/160999.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Fri, 16 Nov 2007 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160999.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160999.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160999.html</trackback:ping><description><![CDATA[xml中只能有一个根节点<br />
<br />
xml中dtd的定义<br />
<pre>&lt;!-- address.dtd --&gt;<br />
&lt;!ELEMENT address (name, street, city, state, postal-code)&gt;<br />
&lt;!ELEMENT name (title? first-name, last-name)&gt;<br />
&lt;!ELEMENT title (#PCDATA)&gt;<br />
&lt;!ELEMENT first-name (#PCDATA)&gt;<br />
&lt;!ELEMENT last-name (#PCDATA)&gt;<br />
&lt;!ELEMENT street (#PCDATA)&gt;<br />
&lt;!ELEMENT city (#PCDATA)&gt;<br />
&lt;!ELEMENT state (#PCDATA)&gt;<br />
&lt;!ELEMENT postal-code (#PCDATA)&gt;</pre>
其中<br />
<pre>#PCDATA</pre>
<code>#PCDATA</code> stands for parsed character data; you can't include another element in these elements.<br />
<br />
定义attribute<br />
<pre>&lt;!ELEMENT city (#PCDATA)&gt;<br />
&lt;!ATTLIST city state CDATA #REQUIRED<br />
postal-code CDATA #REQUIRED&gt;<br />
<br />
<a name="schemasample">A sample XML schema<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;<br />
&lt;xsd:element name="address"&gt;<br />
&lt;xsd:complexType&gt;<br />
&lt;xsd:sequence&gt;<br />
&lt;xsd:element ref="name"/&gt;<br />
&lt;xsd:element ref="street"/&gt;<br />
&lt;xsd:element ref="city"/&gt;<br />
&lt;xsd:element ref="state"/&gt;<br />
&lt;xsd:element ref="postal-code"/&gt;<br />
&lt;/xsd:sequence&gt;<br />
&lt;/xsd:complexType&gt;<br />
&lt;/xsd:element&gt;<br />
<br />
&lt;xsd:element name="name"&gt;<br />
&lt;xsd:complexType&gt;<br />
&lt;xsd:sequence&gt;<br />
&lt;xsd:element ref="title" minOccurs="0"/&gt;<br />
&lt;xsd:element ref="first-Name"/&gt;<br />
&lt;xsd:element ref="last-Name"/&gt;<br />
&lt;/xsd:sequence&gt;<br />
&lt;/xsd:complexType&gt;<br />
&lt;/xsd:element&gt;<br />
<br />
&lt;xsd:element name="title"      type="xsd:string"/&gt;<br />
&lt;xsd:element name="first-Name" type="xsd:string"/&gt;<br />
&lt;xsd:element name="last-Name"  type="xsd:string"/&gt;<br />
&lt;xsd:element name="street"     type="xsd:string"/&gt;<br />
&lt;xsd:element name="city"       type="xsd:string"/&gt;<br />
<br />
&lt;xsd:element name="state"&gt;<br />
&lt;xsd:simpleType&gt;<br />
&lt;xsd:restriction base="xsd:string"&gt;<br />
&lt;xsd:length value="2"/&gt;<br />
&lt;/xsd:restriction&gt;<br />
&lt;/xsd:simpleType&gt;<br />
&lt;/xsd:element&gt;<br />
<br />
&lt;xsd:element name="postal-code"&gt;<br />
&lt;xsd:simpleType&gt;<br />
&lt;xsd:restriction base="xsd:string"&gt;<br />
&lt;xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/&gt;<br />
&lt;/xsd:restriction&gt;<br />
&lt;/xsd:simpleType&gt;<br />
&lt;/xsd:element&gt;<br />
&lt;/xsd:schema&gt;<br />
</a></pre>
<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/160999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-16 13:57 <a href="http://www.blogjava.net/liuzheng/articles/160999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析xml时对DOM和SAX的选择</title><link>http://www.blogjava.net/liuzheng/articles/160798.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 15 Nov 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160798.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160798.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160798.html</trackback:ping><description><![CDATA[<font face="Verdana, Arial, Helvetica" size="2">
<p>选择 DOM 还是选择 SAX，这取决于下面几个因素：</p>
<ul>
    <li>
    <strong>应用程序的目的：</strong>如果打算对数据作出更改并将它输出为 XML，那么在大多数情况下，DOM 是适当的选择。并不是说使用 SAX 就不能更改数据，但是该过程要复杂得多，因为您必须对数据的一份拷贝而不是对数据本身作出更改。</li>
    <li>
    <strong>数据容量：</strong> 对于大型文件，SAX 是更好的选择。</li>
    <li>
    <strong>数据将如何使用：</strong>如果只有数据中的少量部分会被使用，那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面，如果您知道自己以后会回头引用已处理过的大量信息，那么 SAX 也许不是恰当的选择。</li>
    <li>
    <strong>对速度的需要：</strong> SAX 实现通常要比 DOM 实现更快。</li>
</ul>
<p>SAX 和 DOM 不是相互排斥的，记住这点很重要。您可以使用 DOM 来创建 SAX 事件流，也可以使用 SAX 来创建 DOM 树。事实上，用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务！</p>
</font>
<img src ="http://www.blogjava.net/liuzheng/aggbug/160798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-15 17:29 <a href="http://www.blogjava.net/liuzheng/articles/160798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习sax解析xml心得</title><link>http://www.blogjava.net/liuzheng/articles/160797.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 15 Nov 2007 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160797.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160797.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160797.html</trackback:ping><description><![CDATA[可以使用SAXParser的parse方法进行解析，也可以使用XmlReader的parse方法进行解析，但是最好是使用XmlReader，因为XmlReader是接口。<br />
基本的初始化方法如下：<br />
File f=new File("d:"+File.separator+"e.xml");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;InputSource ip=new InputSource(new FileInputStream(f));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SAXParser&nbsp; s=SAXParserFactory.newInstance().newSAXParser();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;XMLReader xmlReader=s.getXMLReader();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;xmlReader.setContentHandler(new MyHandler());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;xmlReader.parse(ip);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (ParserConfigurationException e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (SAXException e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
其中MyHandler类继承了DefaultHandler，可以overwrite其中的方法，使其满足需求。<br />
例子：<br />
<br />
public void startElement(String uri, String localName, String name,<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Attributes attributes) throws SAXException {<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (logger.isInfoEnabled()) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.info("startElement(String, String, String, Attributes) - uri="<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ uri<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ ", localName="<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ localName<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ ", name="<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ name );<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; attributes.getLength(); i++) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (logger.isInfoEnabled()) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info("endElement(String, String, String) - uri=" + uri<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;+ ", localName=" + localName + ", qName=" + attributes.getQName(i)+ ", attributes=" + attributes.getValue(i));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super.startElement(uri, localName, name, attributes);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<span style="color: red;">//对text node的处理</span><br />
public void characters(char[] ch, int start, int length)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;throws SAXException {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (logger.isInfoEnabled()) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info("characters(char[], int, int) - ch="+ new String(ch,start,length));<span style="color: red;">//这里这样子写才能得到text node 真正的<span style="color: red;"><span style="color: red;">值。</span><font face="Verdana, Arial, Helvetica" size="2"><strong>范围：</strong>
<code>characters()</code> 事件不仅包括不仅一个字符串。它还包括起始和长度信息。实际上，<code>ch</code> 字符数组包括整个文档。应用程序一定不能尝试读取馈送给 <code>characters()</code> 事件的范围之外的字符。</font></span></span><font face="Verdana, Arial, Helvetica" size="2"></font><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super.characters(ch, start, length);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/160797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-15 17:27 <a href="http://www.blogjava.net/liuzheng/articles/160797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath简单语法</title><link>http://www.blogjava.net/liuzheng/articles/160562.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Wed, 14 Nov 2007 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160562.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160562.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160562.html</trackback:ping><description><![CDATA[<h2>
<a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/leves/archive/2005/11/25/284407.html">XPath  简单语法</a>
</h2>
&nbsp;
<p>XPath 是XML的查询语言，和SQL的角色很类似。以下面XML为例，介绍XPath 的语法。</p>
<pre>&nbsp;</pre>
<pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</pre>
<pre>&lt;catalog&gt;</pre>
<pre>&nbsp;&lt;cd country="USA"&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;title&gt;Empire Burlesque&lt;/title&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;artist&gt;Bob Dylan&lt;/artist&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;price&gt;10.90&lt;/price&gt;</pre>
<pre>&nbsp;&lt;/cd&gt;</pre>
<pre>&nbsp;&lt;cd country="UK"&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;title&gt;Hide your heart&lt;/title&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;artist&gt;Bonnie Tyler&lt;/artist&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;price&gt;9.90&lt;/price&gt;</pre>
<pre>&nbsp;&lt;/cd&gt;</pre>
<pre>&nbsp;&lt;cd country="USA"&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;title&gt;Greatest Hits&lt;/title&gt; </pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&lt;artist&gt;Dolly Parton&lt;/artist&gt; </pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;9.90&lt;/price&gt; </pre>
<pre>&nbsp;&nbsp;&lt;/cd&gt;</pre>
<pre>&lt;/catalog&gt;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<p><strong>定位节点</strong> <br />
XML是树状结构，类似档案系统内数据夹的结构，XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern)，可以选出 XML档案中，路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用：</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd/price&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<pre>&nbsp;</pre>
<p>如果XPath的开头是一个斜线（/）代表这是绝对路径。如果开头是两个斜线（//）表示文件中所有符合模式的元素都会被选出来，即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做cd的元素（在树中的任何层级都会被选出来）：</p>
<pre>&nbsp;</pre>
<pre>//cd</pre>
<pre>&nbsp;</pre>
<p><strong>选择未知的元素</strong> <br />
使用星号（Wildcards,＊）可以选择未知的元素。下面这个语法会选出/catalog/cd 的所有子元素：</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd/*</pre>
<pre>&nbsp;</pre>
<p>以下的语法会选出所有catalog的子元素中，包含有price作为子元素的元素。</p>
<pre>&nbsp;</pre>
<pre>/catalog/*/price</pre>
<pre>&nbsp;</pre>
<p>以下的语法会选出有两层父节点，叫做price的所有元素。</p>
<pre>&nbsp;</pre>
<pre>/*/*/price</pre>
<pre>&nbsp;</pre>
<p>以下的语法会选择出文件中的所有元素。</p>
<pre>&nbsp;</pre>
<pre>//*</pre>
<pre>&nbsp;</pre>
<p>要注意的是，想要存取不分层级的元素，XPath语法必须以两个斜线开头(//)，想要存取未知元素才用星号(*)，星号只能代表未知名称的元素，不能代表未知层级的元素。</p>
<p><strong>选择分支</strong> <br />
使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd[1]</pre>
<pre>&nbsp;</pre>
<p>以下语法选择catalog中的最后一个cd元素：（XPathj并没有定义 first() 这种函式喔，用上例的 [1]就可以取出第一个元素。</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd[last()]</pre>
<pre>&nbsp;</pre>
<p>以下语法选出含有price子元素的所有/catalog/cd元素。</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd[price]</pre>
<pre>&nbsp;</pre>
<p>以下语法选出price元素的值等于10.90的所有/catalog/cd元素</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd[price=10.90]</pre>
<pre>&nbsp;</pre>
<p>以下语法选出price元素的值等于10.90的所有/catalog/cd元素的price元素</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd[price=10.90]/price</pre>
<pre>&nbsp;</pre>
<p><strong>选择一个以上的路径</strong> <br />
使用Or操作数(|)就可以选择一个以上的路径。例如：</p>
<pre>&nbsp;</pre>
<pre>/catalog/cd/title | catalog/cd/artist</pre>
<pre>&nbsp;</pre>
<p>选择所有title以及artist元素</p>
<pre>&nbsp;</pre>
<pre>//title | //artist</pre>
<pre>&nbsp;</pre>
<p>选择所有title以及artist以及price元素</p>
<pre>&nbsp;</pre>
<pre>//title | //artist | //price</pre>
<pre>&nbsp;</pre>
<p><strong>选择属性</strong> <br />
在XPath中，除了选择元素以外，也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性：</p>
<pre>&nbsp;</pre>
<pre>//@country</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<p>选择所有含有country这个属性的cd元素：</p>
<pre>&nbsp;</pre>
<pre>//cd[@country]</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<p>以下语法选择出含有属性的所有cd元素</p>
<pre>&nbsp;</pre>
<pre>//cd[@*]</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<p>以下语法选择出country属性值为UK的cd元素</p>
<pre>&nbsp;</pre>
<pre>//cd[@country='UK']</pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/160562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-14 15:24 <a href="http://www.blogjava.net/liuzheng/articles/160562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>