闲人笔记2:XML

[b]Extensible Markup Language (XML)[/b]
霍格沃兹有4个学院,他们分别是Gryffindor,Ravenclaw,Slytherin,Hufflepuff。Hermione,Harry,Ron他们在Gryffindor。
我们用一个简单的harry.xml文件:

<?xml version="1.0" encoding="UTF-8"?>  
<!-- introduction to XML markup -->
<Hogwarts>
<Gryffindor>
<student>Hermione</student>
<student>Harry</student>
<student>Ron</student>
</Gryffindor>
<Ravenclaw>
<student>Susan</student>
</Ravenclaw>
<Slytherin>
<student>Malfoy</student>
</Slytherin>
<Hufflepuff>
<student>WhoKnow</student>
</Hufflepuff>
</Hogwarts>


其中
<?xml version="1.0" encoding="UTF-8"?> 版本与编码
此外,还要注意这些
大小写敏感,<Hogwarts></Hogwarts>不可以</hogwarts>
必须是ASCII (American Standard Code for Information Interchange) 码,包含26个英文字母,0-9之间的数字,或者是特殊字符!- ?
(& 为 amp;), (< 为 <),( > 为 >), ( ‘ 为&apos;) ( “ 为").
如果要表示“<>&”则为<message><>&</message>

然后我们可以用右键,用IE浏览器打开它,如图
[img]http://whoknow.iteye.com/upload/picture/pic/41480/50fcedcc-b28c-3af6-8d66-cd689fc9574e.jpg[/img]

恩,看起来不错。不过仅仅这样描述数据很无聊的。我们再在开头加这样1行
<?xml-stylesheet type="text/xsl" href="magic.xsl"?>
href 装饰文件的位置

[b]Extensible Stylesheet Language Transformations (XSLT)[/b]

Xsl是XML文件的修饰描述,比如,XML是数据,那么XSL就是数据的表现形式,你可以将它以任意的形式表现出来。我们新建一个magic.xsl文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head><title>Magic School</title></head>
<body>
<p><b><h1>harry potter and the half blood prince</h1></b></p>
<xsl:apply-templates select="school"/>
</body>
</html>
</xsl:template>
<xsl:template match="school">
<p align="left">
<table border="1" width="300" bordercolor="black" bgcolor="blue">
<tr><b>welcome to our school <xsl:value-of select="@name"/>!!</b></tr>
<tr bgcolor="white">
<td>House_Name</td>
<td>Student_Name</td>
</tr>
<xsl:for-each select="house">
<tr bgcolor="white">
<td>
<xsl:value-of select="@name"/>
</td>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</table>
</p>
</xsl:template>
</xsl:stylesheet>

我们再用ie打开之前的harry.xml文件
[img]http://whoknow.iteye.com/upload/picture/pic/41478/86faac51-939d-3378-a65e-4852784561cc.jpg[/img]
哦,就好像在浏览一个html文件,但是当我们点击查看-》源文件时。它依然是xml文件。
XSL文件作为XML的表现形式,负责表示展现数据的形式,我们来看magic.xsl文件的几个片段

<html>
<head><title>Magic School</title></head>
<body>
<p><b><h1>harry potter and the half blood prince</h1></b></p>
<xsl:apply-templates select="school"/>
</body>
</html>

这里我们使用html来描述它,因为在xml文件的开头加了
<?xml-stylesheet type="text/xsl" href="magic.xsl"?>它会来找寻这个装饰文件。
<xsl:apply-templates select="school"/>之后寻找school的装饰模板。
使用match属性在xml中寻找,符合类型的数据
<xsl:template match="school"> 
<table border="1">
<xsl:for-each select="house">

</xsl:for-each>
</table>
</xsl:template>

可以在 for-each里再加上
<xsl:sort select = "@name" order = "ascending"/>这样来排序
<xsl:value-of select="@name"/>
如果前面加了@符号是取属性.不加是取元素。
其它的用法,请参考相应的书籍

[b]Document Type Definitions (DTDs) and Schema.[/b]
<!DOCTYPE MagicSchool SYSTEM "magic.dtd">
一个简单的dtd文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT MagicSchool (school*)>
<!ELEMENT school ( house* )>
<!ATTLIST school name ENTITY #REQUIRED>
<!ELEMENT house (student*)>
<!ATTLIST school name ENTITY #REQUIRED>
<!ELEMENT student (#PCDATA)>

它可以约束以下的我们的xml文件,限定有school开始,有多个house元素,并且必须要有名字。
<school name="Hogwarts"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="magic_schemas.xsd">
将harry.xml中的这一行修改,使用schemas的方式

[b]schemas语法请参考[/b]
[url]http://www.w3schools.com/Schema/schema_example.asp[/url]
[b]dtd和schema验证请参考[/b]
[url]http://www.dom4j.org/dom4j-1.6.1/faq.html#how-validate[/url]
[url]http://www.iteye.com/problems/13525[/url]

[b]一个例子[/b]
org.hibernate.cfg包中的Configuration类需要加载hibernate所需的所有的配置文件。而这其中可能会有很多的加载方式,比如File,Dir,InputStream,jar,URL… hibernate在这里创建了一个叫XMLHelper的类来专门负责创建Dom对象。而在Configuration类中,则有很多重载的方法,已应对各种数据加载方式。
直到获得一个File的路径,然后交给XMLHelper处理,在XMLHelper中有DOMReader,SAXReader两种方式加载方式。
Errorlogger做为XMLHepler的内部类,处理在加载过程中的错误,如:

//在public SAXReader createSAXReader 方法中设置ErrorHandler
saxReader.setErrorHandler( new ErrorLogger(file, errorsList) );

//ErrorHandler中的错误处理方法
public void error(SAXParseException error) {
log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
errors.add(error);
}
public void fatalError(SAXParseException error) {
error(error);
}
public void warning(SAXParseException warn) {
log.warn( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() );
}

//设定默认的EntityResolver
public static final EntityResolver DEFAULT_DTD_RESOLVER = new DTDEntityResolver();
DTDEntityResolver做为默认的dtd验证.请参考下图和hibernate源码

[img]http://whoknow.iteye.com/upload/picture/pic/41476/29afeb02-6a91-3f48-8a87-81e9ffec4338.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值