??xml version="1.0" encoding="utf-8" standalone="yes"?> 例子Q文件characters.xml <characters> 查询文gQDate.xquery 在命令提CZQ输入: D:\xml>java net.sf.saxon.Query -s characters.xml Date.xquery
1、准备工?BR> sax相关的类都封装在org.xml.sax中,其中接口org.xml.sax.XMLReader是SAX2的核心类Q你的xml解析器应该提供这个接口的实现cR比?org.apache.xerces.parsers.SAXParser"q个cR?BR>2、sax的处理流E?BR> sax基本的处理方法是在解析之前注册各U处理类QHandlerQ,在解析的时候callbackq些处理器,内容处理器就是其中最主要的一个。D例来说明的话Q如下的xml文档Q?BR>
<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>
Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)
org.xml.sax.ContentHandler
package org.xml.sax;
public interface ContentHandler
{
public void setDocumentLocator (Locator locator);
public void startDocument ()throws SAXException;
public void endDocument()throws SAXException;
public void startPrefixMapping (String prefix, String uri) throws SAXException;
public void endPrefixMapping (String prefix)throws SAXException;
public void startElement (String namespaceURI, String localName,String qName, Attributes atts)
throws SAXException; public void endElement (String namespaceURI, String localName,String qName)throws SAXException;
public void characters (char ch[], int start, int length)throws SAXException;
public void ignorableWhitespace (char ch[], int start, int length)throws SAXException;
public void processingInstruction (String target, String data)throws SAXException;
public void skippedEntity (String name)throws SAXException;
}
ErrorHandlerq个cL供两个方法,warning和errorQ用于在处理解析q程发生的错误和警告Q包括xml格式的错误和文档l构查的错误?BR>5、过滤器和写入器
org.xml.sax.XMLFilterq个接口扩展了XMLReader接口Q添加了两个新方法:
public void setParent(XMLReader reader);
public XMLReader getParent();
他的意图比较明显Q将一个已有的XMLReader作ؓ上解析器,他将得以在这个XMLReader执行捕获sax事g之前捕获他们Qƈ作一些操作,最后在铑XMLReader的对象,q里的概念很像cocoon的内部实现?BR> q里q要提到的一个类是:org.xml.sax.helpers.XMLFilterImplq个cdCXMLFilter接口Q不仅如此,他还提供了ContentHandlerQErrorHandler{处理器的处理方法通道。也是_如果l承XMLFilterImplq覆盖startElementҎQ那么你写得代码在实际的Reader执行startElementҎ被执行之前被执行。下面是一个注册Filter的例子:
XMLReader reader = XMLReaderFactory.createXMLreader();
MyFilter filter = new MyFilter(reader
.);
filter.setContenHandler(
);
另外Q你当然也可以再写一个filter2,而把filter作ؓparent传入Q这样就构成了一个事件处理链?BR>
org.xml.sax.XMLWriter是一个实际的qo器,他也是通过上面说到的方式:扩展XMLFilterImpl来实现的。具体的c除了XMLWriter外还有DataWriterQ他扩展XMLWriter?BR> 需要注意的是这两个cM般不用来做实际的写入操作,但是他们可以用于很好的表现sax处理铄中间l果Q也是快照snapshot
6、sax的属性和特征
属性和特征在XMLReader接口里面体现为:
getFeature(String),setFeature(String,boolean)Ҏ和getProperty(String),setProperty(String,Object)ҎQ用来控制解析过E的一些选项Q比如是否进行DTD校验。比如:
reader.setFeature("reader.setFeature("
client.xml
<联系人列?/SPAN>> <联系?/SPAN>>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234?/SPAN></街道>
<城市>北京?/SPAN></城市>
<省䆾>北京</省䆾>
</地址>
<直接上司>
<姓名>王五</姓名>
<电话>
<U书电话>(010)62345678</U书电话>
<手机>13601234567</手机>
</电话>
</直接上司>
</联系?/SPAN>>
</联系人列?/SPAN>>
以上是我们想要最l表辄数据格式Q其中,联系人的直接上司属性有炚w烦,因ؓ整个直接上司表达的是一个“企业经理”的“对象”,该“对象”可以以另外的XML形式体现Q如下:
<?xml version="1.0" encoding="GB2312"?>
<企业l理>
<姓名>王五</姓名>
<电话>
<U书电话>(010)62345678</U书电话>
<手机>13601234567</手机>
</电话>
</企业l理>
看以上的两个文档Q实际上是我们惌辄数据Q两个抽象的实体“联pMh”和“企业经理”之间存在着一对一的关pR?BR> 但是我们现在有个ȝQ在联系人列表这个XML当中Q有两个“姓名”元素和两个“电话”元素,他们表达的是不同的意思,其文档格式定义也不同。他们分别对应着不同的DTD或者是Schema?BR> Z解决q一问题Q就有了命名I间的概念,首先Q对于我们要最l作用于其上的client.xmlQ他必须首先区别联系人和企业l理Q做法就是在前面加前~Q比如联pMh的名字改为“联pMhQ名字”而企业经理的名字则改为“企业经理:名字?BR> 其次Q两个不同的文档定义文g必须首先定义好命名空_在作用于XML文g的时候,使命名空间和XML声明中的命名I间一?/STRONG>?BR> 下面分别l出例子代码Q?BR> client.xmlQ?BR>
<?xml version="1.0" encoding="GB2312"?>
<联系?联系人列?nbsp;
xmlns:联系?/SPAN>="id"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="id client.xsd id2 manager.xsd"
xmlns:企业l理="id2">
<联系?联系?/SPAN>>
<联系?姓名>张三</联系?姓名>
<联系?ID>001</联系?ID>
<联系?公司>A公司</联系?公司>
<联系?EMAIL>zhang@联系?com</联系?EMAIL>
<联系?电话>(010)62345678</联系?电话>
<联系?地址>
<联系?街道>五街1234?/SPAN></联系?街道>
<联系?城市>北京?/SPAN></联系?城市>
<联系?省䆾>北京</联系?省䆾>
</联系?地址>
<联系?直接上司>
<企业l理:姓名>王五</企业l理:姓名>
<企业l理:电话>
<企业l理:U书电话>(010)62345678</企业l理:U书电话>
<企业l理:手机>13601234567</企业l理:手机>
</企业l理:电话>
</联系?直接上司>
</联系?联系?/SPAN>>
<联系?联系?/SPAN>>
<联系?姓名>李四</联系?姓名>
<联系?ID>002</联系?ID>
<联系?公司>B公司</联系?公司>
<联系?EMAIL>li@bbb.org</联系?EMAIL>
<联系?电话>(021)87654321</联系?电话>
<联系?地址>
<联系?街道>南京?876?/SPAN></联系?街道>
<联系?城市>上v?/SPAN></联系?城市>
<联系?省䆾>上v</联系?省䆾>
</联系?地址>
<联系?直接上司>aa</联系?直接上司>
</联系?联系?/SPAN>>
</联系?联系人列?/SPAN>>
client.xsdQ?BR>
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id" targetNamespace="id" elementFormDefault="qualified">
<xs:element name="EMAIL" type="xs:string"/>
<xs:element name="ID" type="xs:string"/>
<xs:element name="公司" type="xs:string"/>
<xs:element name="地址">
<xs:complexType>
<xs:sequence>
<xs:element ref="街道"/>
<xs:element ref="城市"/>
<xs:element ref="省䆾"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="城市" type="xs:string"/>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="电话" type="xs:string"/>
<xs:element name="省䆾" type="xs:string"/>
<xs:element name="联系?>
<xs:complexType>
<xs:sequence>
<xs:element ref="姓名"/>
<xs:element ref="ID"/>
<xs:element ref="公司"/>
<xs:element ref="EMAIL"/>
<xs:element ref="电话"/>
<xs:element ref="地址"/>
<xs:element ref="直接上司"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="联系人列?>
<xs:complexType>
<xs:sequence>
<xs:element ref="联系? maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="街道" type="xs:string"/>
<xs:element name="直接上司" type="xs:anyType"/>
</xs:schema>
manager.xsdQ?BR>
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id2" targetNamespace="id2" elementFormDefault="qualified">
<xs:element name="企业l理">
<xs:complexType>
<xs:sequence>
<xs:element ref="姓名"/>
<xs:element ref="电话"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="手机" type="xs:string"/>
<xs:element name="电话">
<xs:complexType>
<xs:sequence>
<xs:element ref="U书电话"/>
<xs:element ref="手机"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="U书电话" type="xs:string"/>
</xs:schema>
说明Q我在这里用id和id2来表C命名空间是应ؓ很多Z认ؓ那个命名I间的网址会在解析XML的时候被讉KQ我一开始也q样认ؓQ所以改成id来做个测试?img src ="http://www.aygfsteel.com/lqsun/aggbug/1840.html" width = "1" height = "1" />
W一点要注意的:DTD中的关键字必d部大写!
一、DTD的位|?BR> DTD可以攑֜xml文档里面Q?BR>
《XML入门?BR>
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列?nbsp;(联系?*>
<!ELEMENT 联系?nbsp;(姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省䆾)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省䆾 (#PCDATA)>
]>
<联系人列?/SPAN>>
...................................
攑֜里面的时候,应该注意“standalone = "yes"?BR>也可以放在外面,攑֜外面有两UŞ式,一U是引用本地文gQ如Q?BR>
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 联系人列?nbsp;SYSTEM "fclml.dtd">
<联系人列?/SPAN>>
..................
引用的格式是Q?lt;!DOCTYPE 根元素名 SYSTEM "外部DTD文g的URL">
另外一U是引用公共的文档定义,如:
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
其中DTD名称解释为:
q个DTD标识的命名规则和XML文g的命名规则稍有不同。具体地_DTD名称只能包含字母、数字、空格和下面的符P_%$#@()+:=/!*;?。同ӞDTD名称q必ȝ合一些标准的规定。例如,ISO标准的DTD以“ISO”三个字母开_被改q的非ISO标准的DTD以加号?”开_未被改进的非ISO标准的DTD以减号?”开头?BR>所以说struts的配|文件就是“未被改q的非ISO标准的DTD文档?BR>
二、DTD的内?BR>DTD文档的内Ҏȝ下来有几个比较重要也比较常用的:参数实体定义、元素定义和属性定?BR>1、参数实体定?BR> 实体实际上在XML当中充当宏定义或者别名之cȝ意思,也可以理解成public static String......
参数实体是专门用在DTD当中的,你可以在下面两项元素定义和属性定义中引用参数实体?BR> 其定义方式如下:
<!ENTITY % 实体?"实体内容"> 注意Q在XML中的实体定义是没??BR> 或者是Q?BR> <!ENTITY % 实体?SYSTEM "外部文g?>
引用方式Q?BR> %实体?BR> 例子Q?BR> <!ENTITY % Boolean "(true|false|yes|no)">表示定义了一个Boolean 的参数实体,值是"(true|false|yes|no)"
在struts的配|文件的DTD中有如下描述Q?BR> <!ATTLIST form-bean dynamic %Boolean; #IMPLIED>
也就定义了form-beanq个元素的dynamic属性可以取得值是true、false、yes、no其中之一?BR>
2、元素定?BR> 用来定义元素的格式以及元素的子孙{?BR> 定义形式Q?nbsp;
<!ELEMENT 元素?元素内容描述>
元素定义q里׃幅有限Q仅列几个例?BR> 1?lt;!ELEMENT 联系人列?ANY>表示联系人列表这个元素的格式及其子孙都不受限制?BR> 2?lt;!ELEMENT 姓名(#PCDATA)>表示姓名q个元素只能包含文本数据
3?lt;!ELEMENT 联系?姓名 EMAIL)>表示联系个元素只能包含姓名和EMAIL两种子孙Q顺序不限,q且姓名只能׃个,EMAIL也只能由一个?BR> 4?lt;!ELEMENT 联系?姓名,EMAIL)>表示联系个元素只能包含姓名和EMAIL两种子孙Q有序的限Ӟq且姓名只能׃个,EMAIL也只能由一个?BR> 5?lt;!ELEMENT 联系?姓名QEMAIL+)>表示联系人必L且仅有一个姓名子孙,有一个到多个EMAIL子孙Q其中,如果+换作*Q则表示零个或者多个?/FONT>
6?lt;!ELEMENT 联系?姓名QEMAIL)+>表示联系人有一l到多组子孙Q每l中有且仅有一对姓名和EMAIL
7?lt;!ELEMENT 联系?姓名Q?电话|EMAIL))>表示联系人有一l到多组子孙Q每l中W一个元素一定是姓名Q第二个元素要么是电话,要么是EMAILQ两者选一个?BR> 8?lt;!ELEMENT 联系?EMPTY>联系个元素不包含M子孙Q也不包含文本?BR>
3、属性定?BR> 格式Q?/STRONG><!ATTLIST 元素?Q属性名 属性类?~省|*>
例子Q?BR> 1?lt;!ATTLIST 面作?
姓名 #CDATA #IMPLIED
q龄 #CDATA #IMPLIED
联系信息 #CDATA #REQUIRED
|站职务 #CDATA #FIXED "面作?
个h爱好 #CDATA "上网">
其中Q定义了面作者这个元素的属性可以有“姓名”,“年龄”,“联pM息”,“网站职务”和“个人爱好?BR> q且Q姓名和q龄是纯文本Q可以没有,联系信息必须有,|站职务一定是“页面作者”,个h爱好如果不填Q则默认是上|?BR>
2?lt;!ATTLIST ?cd( 鸡肉 | 牛肉 | 猪肉 | D ) "鸡肉">元素肉可以有“类型”属性,cd属性可以选择 鸡肉 | 牛肉 | 猪肉 | D其中一个,默认是“鸡肉?BR> 3?lt;!ATTLIST 联系?~号 ID #REQUIRED>联系人元素有且必L~号属性,其类型是ID型的QID型或者是IDREF型的属性值必L一个有效的XML名称Q它由字母、数字或下划U开始,名字中不能出现空白符。类似Html中的ID?BR> 4、另外类型NMTOKEN和NMTOKENSq有NOTATIONcd我还不是太明白,那位明白的不妨给出^_^?BR>
看到有h问如何用xqueryQ其实我也是个菜鸟?BR>刚刚q行了两个例子,l不会的指个路?BR>首先下蝲saxon8.1.1 http://saxon.sourceforge.net/
Saxon-B 8.1.1是免费的QSaxon-SA 8.1.1是有试用期的Q前者就够了?BR>pȝ要安装jdk1.4.1以上版本Q因为saxon是用q个版本写的Q但不知?.3.1行不?BR>记得讄JAVA_HOME环境变量指向jdk?BR>然后Q试试吧Q?
<character>
<name>Aleria</name>
<gender>Female</gender>
<species>Heroleim</species>
<vocation>Bard</vocation>
<level>5</level>
<health>25</health>
</character>
<character>
<name>Shar</name>
<gender>Male</gender>
<species>Human</species>
<vocation>Merchant</vocation>
<level>6</level>
<health>28</health>
</character>
<character>
<name>Gite</name>
<gender>Female</gender>
<species>Aelvar</species>
<vocation>Mage</vocation>
<level>7</level>
<health>18</health>
</character>
<character>
<name>Horukkan</name>
<gender>Male</gender>
<species>Udrecht</species>
<vocation>Warrior</vocation>
<level>5</level>
<health>32</health>
</character>
<character>
<name>Gounna</name>
<gender>Female</gender>
<species>Noleim</species>
<vocation>Mage</vocation>
<level>8</level>
<health>31</health>
</character>
<character>
<name>Sheira</name>
<gender>Female</gender>
<species>Human</species>
<vocation>Cleric</vocation>
<level>4</level>
<health>17</health>
</character>
<character>
<name>Drue</name>
<gender>Female</gender>
<species>Voleim</species>
<vocation>Warrior</vocation>
<level>6</level>
<health>32</health>
</character>
<character>
<name>Paccu</name>
<gender>Male</gender>
<species>Human</species>
<vocation>Merchant</vocation>
<level>5</level>
<health>24</health>
</character>
</characters>
for $character in doc('characters.xml')//character
order by $character/name descending
return
<dateReport>
{$character/name}
</dateReport>
(: Stylus Studio meta-information - (c)1998-2003. Sonic Software Corporation. All rights reserved.
<metaInformation>
<scenarios/><MapperInfo><TargetSchema SchemaFilePath="" SchemaRoot="" AssociatedInstance=""/></MapperInfo>
</metaInformation>
:)
set classpath=d:\saxon\saxon8.jar Qsaxon8.jar所在文件夹Q?BR>java net.sf.saxon.Query -s characters.xml Date.xquery
ok!
看结果吧Q?/P>
<?xml version="1.0" encoding="UTF-8"?>
<dateReport>
<name>Sheira</name>
</dateReport>
<dateReport>
<name>Shar</name>
</dateReport>
<dateReport>
<name>Paccu</name>
</dateReport>
<dateReport>
<name>Horukkan</name>
</dateReport>
<dateReport>
<name>Gounna</name>
</dateReport>
<dateReport>
<name>Gite</name>
</dateReport>
<dateReport>
<name>Drue</name>
</dateReport>
<dateReport>
<name>Aleria</name>
</dateReport>
1、xmlQ这个不用说了,可扩展标记语a
2、dtd&schemaQ用于规定xml文档正确性的东东。这个东襉K面内容好多,够学一阵子的?BR>3、xslQeXtensible Stylesheet LanguageQ可扩展的样式表语言Q这是个好东西,可以xml转化成Q何东西(比如转化成javaBean的类源文Ӟ或者sql脚本Q?BR> 今天q得知,xsl包括两大部分QxsltQeXtensible Stylesheet Language TransformationQ和xsl-foQformatting ObjectQ,前一部分用来转换xmlQ后一部分用来格式化输出(cMcss的功能)?BR>4、xsltQ如前所qͼ用来转化xmlQ他可以选择那些昄那些不显C,可以排序Q甚臛_以统计,比如countQ)。而且目前xslt也在快速发展着Q新的函数库层出不穷Q值得期待和深入学习?BR>5、xPathQxslt中一个重要组成部分,目前版本好像?.0QXPath是用来帮助XSLT在XML源文档中查找定位信息的语aQ功能非常的强大Q日后将作ؓ一个专题进行学习?BR>6、SAXQSimple Application interface for XMLQ一个简单的xml处理apiQ处理一般流E如下:
7、domQ高U抽象的xml操作接口Q当然也要用比如xercesq样的解析器。dom中以树型防问xml文档Qƈ且有xsltQxPath{的支持?BR>8、JAXPQsun公司的称为“Java API for XML Parsing”的Java XML解析器APIQ其?STRONG>q不包含解析器!
JAXP是一个抽象层Q给出接口定义,他必M用第三方的如xercesq样的解析器Q但是他可以通过配置文g的Ş式很方便的更换解析器Q他的作用就是给不同的解析器提供了一个统一操作的^収ͼ提供SAX的钩子,提供DOM的钩子?BR>9、xQueryQ一U更加强大的XML查询语言Q如果XML有一天可以取代关pL据库的话Q这个东东肯定会像SQL今天q样风行Q这Ҏ一个简单的例子来演CXQuery
讲的不对的地方请指正Q?/P>