??xml version="1.0" encoding="utf-8" standalone="yes"?> XML 解析器通常情况下会(x)处理XML文档中的所有文本?/strong> 当XML元素被解析的时候,XML元素内部的文本也?x)被解? XML解析器这样做的原因是XML元素内部可能q包含了(jin)别的元素Q象下面的例子,name元素内部包含?jin)first和last两个元素: 解析器会(x)认ؓ(f)上面的代码是q样? 不合法的XML字符必须被替换ؓ(f)相应的实体? 如果在XML文档中用类?<" 的字W? 那么解析器将?x)出现错误,因?f)解析器会(x)认ؓ(f)q是一个新元素的开始。所以不应该象下面那样书写代? Z(jin)避免出现q种情况Q必d字符"<" 转换成实体,象下面这? 下面是五个在XML文档中预定义好的实体: 注意: 只有"<" 字符?&"字符对于XML来说是严格禁止用的。剩下的都是合法的,Z(jin)减少出错Q用实体是一个好?fn)惯?/p>
在CDATA内部的所有内定w?x)被解析器忽略?/strong> 如果文本包含?jin)很多?<"字符?&"字符——就象程序代码一P那么最好把他们都放到CDATA部g中?/p>
一?CDATA 部g?<![CDATA[" 标记开始,?]]>"标记l束: 在前面的例子中,所有在CDATA部g之间的文本都?x)被解析器忽略?/p>
CDATA部g之间不能再包含CDATA部gQ不能嵌套)(j)。如果CDATA部g包含?jin)字W?]]>" 或?<![CDATA[" Q将很有可能出错哦?/p>
同样要注意在字符?]]>"之间没有I格或者换行符?/p>
<message>This text is also parsed</message>
<name><first>Bill</first><last>Gates</last></name>
<name>
<first>Bill</first>
<last>Gates</last>
</name>
转义字符
<message>if salary < 1000 then</message>
<message>if salary < 1000 then</message>
<
<
于?/td>
>
>
大于?/td>
&
&
?/td>
'
'
单引?/td>
"
"
双引?/td>
实体必须以符?&"开_(d)以符?;"l尾?/strong>
CDATA部g
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
</script>
CDATA注意事项:
一个schema中声明的元素或者类型只能归C个命名空间中的某一个去Q这两个是,无名命名I间和由targetSchema属性指明的目标命名I间。而targetSchema属性只能在xsQschema的定义中声明Q因而,一个schema中的定义的元素或cd只可能归属于一个有名命名空_(d)但是q有可能归属于无名命名空_(d)(j)?/p>
当elementFormDefault="qualified" Ӟ所有全局元素的子元素被以缺省方式放到目标命名空_(d)但是全局元素或者类型将被放到目标命名空_(d)而当elementFormDefault="unqualified" Ӟ所有全局元素的子元素被以缺省方式放到无名命名空间。而属性的命名I间cM地由attributeFormDefault="Q?来指明?/p>
需要明白的是,elementFormDefault="Q? 是有作用域的Qƈ且是被承的Q除非在子定义中覆盖父定义?/p>
下面三个例子说明?jin)elementFormDefault的用效果。红色表C属于已命名I间的元素,蓝色表示属于未命名空间的元素?/p>
1.定义?jin)目标命名空_(d) 全局elementFormDefault=“unqualified”。这旉?jin)全局元素或者类型将归于目标命名I间外,局部元素将归于无名命名I间?/p>
unqualified.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="unqualified" attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1" type="xs:double"/>
<xs:element name="c2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
unqualified.xml
<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa unqualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</n:c>
2. 定义?jin)目标命名空_(d) 全局elementFormDefault=“qualified”。这时全局元素或者类型将归于目标命名I间Q局部元素将以缺省方式归于目标命名空间?/p>
qualified.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1" type="xs:double"/>
<xs:element name="c2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
qualified.xml
<?xml version="1.0" encoding="UTF-8"?>
<c xmlns="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa qualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</c>
3. 定义?jin)目标命名空_(d) 全局elementFormDefault=“unqualified”。这时全局元素QcQ或者类型将归于目标命名I间。局部元素(c1Qc2Q以~省方式归于无名命名I间。局部元素(c3Q在局部定义中使用form=“qualified”覆盖全局讑֮的unqualifiedQ这使得c3归于目标命名I间Q如果它有子元素Q子元素以~省方式归于目标命名I间Q?/p>
qualified2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="unqualified" attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1" type="xs:double"/>
<xs:element name="c2" type="xs:string"/>
<xs:element name="c3" type="xs:integer" form="qualified"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
qualified2.xml
<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa qualified2.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
<n:c3>0</n:c3>
</n:c>
This is a simplified fraction of a WSDL document:
<message name="getTermRequest"> <portType name="glossaryTerms"> |
In this example the <portType> element defines "glossaryTerms" as the name of a port, and "getTerm" as the name of an operation.
The "getTerm" operation has an input message called "getTermRequest" and an output message called "getTermResponse".
The <message> elements define the parts of each message and the associated data types.
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.
SAX 框架的缺Ҏ(gu)不能记录正在处理元素的上下文。但是优Ҏ(gu)q行时占内存I间比较?yu),效率高。DOM 框架׃在处?XML 旉要ؓ(f)其构造一|(wi)Q所以特Ҏ(gu)好相反。StAX 框架出现?Java SE 6 中,它的设计目标是要结?SAX 框架?DOM 框架的优炏V既要求q行时效率,也要求保持元素的上下文状态?a >清单 5 是一D?StAX 框架处理 XML 文g的代码?/p>
清单 5. 使用 StAX 框架处理 XML 文g
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( ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<work-contact-info>" + "<Location>Shanghai-shuion-333</Location>" + "<Postal>200020</Postal>" + "<Tel><fix>63262299</fix><mobile>1581344454</mobile></Tel>" + "<Appellation>Mr. Wang</Appellation>" + "</work-contact-info>").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(); } } } |
观察后可以发?StAX 框架?SAX 框架h怼的地斏VStAX ?Event.isStartElement
Ҏ(gu)QSAX ?DefaultHandler.startElement
Ҏ(gu)。StAX ?Event.isCharacter
Ҏ(gu)QSAX ?DefaultHandler.character
Ҏ(gu)。实际上q两个框架处?XML 文g的时候用了(jin)怼的模型——将 XML 文g作ؓ(f)元素l成的流Q而不同于 DOM 的树(wi)模型。解?XML 文gӞ应用E序调用 XMLEventReader
?nextEvent
Ҏ(gu)解析下一个元素(或者是解析同一个元素,Ҏ(gu)解析的不同阶D,产生不同元素Q,StAX ׃(x)通过 XMLEventReader
产生一个事件。比如针对同一个元素,可能?x)?StartElement
?EndElement
事g。Ş象的?XMLEventReader
像是一根子,拽一下,解析一个元素,产生一个事件。于是这U技术也被称?#8221;Pull Parser”技术。StAX 在处?XML 文gӞ产生的所有事件是通过一?Iterator
Q?code>XMLEventReader l承?Iterator
Q返回的。应用程序通过q个 Iterator
能知道某个解析事件的前后分别是什么。这cM息就是一个元素的上下文信息?/p>
<!-- address.dtd -->其中
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>
#PCDATA
#PCDATA
stands for parsed character data; you can't include another element in these elements.<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA #REQUIRED
postal-code CDATA #REQUIRED>
A sample XML schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="name"/>
<xsd:element ref="street"/>
<xsd:element ref="city"/>
<xsd:element ref="state"/>
<xsd:element ref="postal-code"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="name">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="title" minOccurs="0"/>
<xsd:element ref="first-Name"/>
<xsd:element ref="last-Name"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="first-Name" type="xsd:string"/>
<xsd:element name="last-Name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:length value="2"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="postal-code">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
选择 DOM q是选择 SAXQ这取决于下面几个因素:(x)
SAX ?DOM 不是怺排斥的,Cq点很重要。?zhn)可以使?DOM 来创?SAX 事g,也可以?SAX 来创?DOM ?wi)。事实上Q用于创?DOM ?wi)的大多数解析器实际上都使?SAX 来完成这个Q务!
characters()
事g不仅包括不仅一个字W串。它q包括v始和长度信息。实际上Q?code>ch 字符数组包括整个文档。应用程序一定不能尝试读取馈送给 characters()
事g的范围之外的字符?/font>XPath 是XML的查询语aQ和SQL的角色很cM。以下面XMLZQ介lXPath 的语法?/p>
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd country="USA">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<price>10.90</price>
</cd>
<cd country="UK">
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<price>9.90</price>
</cd>
<cd country="USA">
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<price>9.90</price>
</cd>
</catalog>
定位节点
XML是树(wi)状结构,cM档案pȝ内数据夹的结构,XPath也类似档案系l的路径命名方式。不qXPath 是一U模?Pattern)Q可以选出 XML档案中,路径W合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:(x)
/catalog/cd/price
如果XPath的开头是一个斜U(/Q代表这是绝对\径。如果开头是两个斜线Q?/Q表C文件中所有符合模式的元素都会(x)被选出来,即是处于树(wi)中不同的层也会(x)被选出来。以下的语法?x)选出文g中所有叫做cd的元素(在树(wi)中的M层都会(x)被选出来)(j)Q?/p>
//cd
选择未知的元?/strong> 以下的语法会(x)选出所有catalog的子元素中,包含有price作ؓ(f)子元素的元素?/p>
以下的语法会(x)选出有两层父节点Q叫做price的所有元素?/p>
以下的语法会(x)选择出文件中的所有元素?/p>
要注意的是,惌存取不分层的元素,XPath语法必须以两个斜U开?//)Q想要存取未知元素才用星?*)Q星号只能代表未知名U的元素Q不能代表未知层U的元素?/p>
选择分支 以下语法选择catalog中的最后一个cd元素Q(XPathjq没有定?first() q种函式喔,用上例的 [1]可以取出第一个元素?/p>
以下语法选出含有price子元素的所?catalog/cd元素?/p>
以下语法选出price元素的值等?0.90的所?catalog/cd元素 以下语法选出price元素的值等?0.90的所?catalog/cd元素的price元素 选择一个以上的路径 选择所有title以及(qing)artist元素 选择所有title以及(qing)artist以及(qing)price元素 选择属?/strong> 选择所有含有countryq个属性的cd元素Q?/p>
以下语法选择出含有属性的所有cd元素 以下语法选择出country属性gؓ(f)UK的cd元素
使用星号QWildcards,Q)(j)可以选择未知的元素。下面这个语法会(x)选出/catalog/cd 的所有子元素Q?/p>
/catalog/cd/*
/catalog/*/price
/*/*/price
//*
使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有W?元素q种东西?/p>
/catalog/cd[1]
/catalog/cd[last()]
/catalog/cd[price]
/catalog/cd[price=10.90]
/catalog/cd[price=10.90]/price
使用Or操作?|)可以选择一个以上的路径。例如:(x)
/catalog/cd/title | catalog/cd/artist
//title | //artist
//title | //artist | //price
在XPath中,除了(jin)选择元素以外Q也可以选择属性。属性都是以@开头。例如选择文g中所有叫做country的属性:(x)
//@country
//cd[@country]
//cd[@*]
//cd[@country='UK']
]]>