闲人笔记2:XML

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;), (< 为 &lt;),( > 为 &gt;), ( ‘ 为&apos;) ( “ 为&quot;).
如果要表示“<>&”则为<message>&lt;&gt;&amp;</message>

然后我们可以用右键,用IE浏览器打开它,如图
闲人笔记2:XML_第1张图片

恩,看起来不错。不过仅仅这样描述数据很无聊的。我们再在开头加这样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文件
闲人笔记2:XML_第2张图片
哦,就好像在浏览一个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源码

闲人笔记2:XML_第3张图片

你可能感兴趣的:(xml,Hibernate,IE,asp,XSL)