Extensible Markup Language (XML)
霍格沃兹有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;), (< 为 <),( > 为 >), ( ‘ 为') ( “ 为").
如果要表示“<>&”则为<message><>&</message>
然后我们可以用右键,用IE浏览器打开它,如图
恩,看起来不错。不过仅仅这样描述数据很无聊的。我们再在开头加这样1行
<?xml-stylesheet type="text/xsl" href="magic.xsl"?>
href 装饰文件的位置
Extensible Stylesheet Language Transformations (XSLT)
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文件
哦,就好像在浏览一个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"/>
如果前面加了@符号是取属性.不加是取元素。
其它的用法,请参考相应的书籍
Document Type Definitions (DTDs) and Schema.
<!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的方式
schemas语法请参考
http://www.w3schools.com/Schema/schema_example.asp
dtd和schema验证请参考
http://www.dom4j.org/dom4j-1.6.1/faq.html#how-validate
http://www.iteye.com/problems/13525
一个例子
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源码