XML 备忘
1.XML命名空间
XML 命名空间(XML Namespaces)
http://www.w3school.com.cn/xml/xml_namespaces.asp
XML学习笔记(一):XML中的命名空间
http://www.cnblogs.com/martin-chen/archive/2011/02/24/xml-studynote-namespace.html
总结,xml命名空间可以出现在元素中,用于解决冲突,即,相同的元素,
如果属于不同的命名空间则可以表示不同含义,不存在冲突.
比如
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
这里,使用了命名空间h,
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
这里使用了f,两个都是table,但是属性不同.
XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
后面的namespaceURI只是用来表示唯一的,xml文档不会真的去访问这个uri.
一个元素可以定义一个默认的命名空间,这样该元素(及其所有子元素)的元素名称可以不写前缀.
默认的命名空间(Default Namespaces)
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
请使用下面的语法:
xmlns="namespaceURI"
这个 XML 文档携带着某个表格中的信息:
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
这样table就可以不用写前缀了.
另外,一个元素里面可以有一个默认命名空间,和多个非默认命名空间
命名空间可以在任何元素中定义,通常在根元素中定义,这样定义一次所有
元素都可以使用命名空间了.
2. XML 的schema
参考:http://www.w3school.com.cn/schema/schema_schema.asp
XML 的schema 也是一种XML格式的文件,这种文件用来定义XML文档的结构,包括控制XML元素和元素的属性等.
XML的schema文件一般保存为.xsd文件,这种文件中,
元素的命名空间,元素类型等必须符合W3C规范的约束.
因为这种约束,XML 的schema可以看成是一种定义XML文档结构的语言了.
比如 <schema> 元素是每一个 XML Schema 的根元素:
<?xml version="1.0"?>
<xs:schema>
...
...
</xs:schema>
<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
...
</xs:schema>
代码解释:
下面的片断:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。
同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:
这个前缀可以定义为别的,不过一般默认就用xs:,不用修改.
这个片断:targetNamespace="http://www.w3school.com.cn"
显示被此 schema 定义的元素 (note,to,from,heading,body) 来自命名空间: "http://www.w3school.com.cn"
命名空间字符串只要唯一就行,不一定非要是网址的格式.
这个命名空间是引入该schema文件的xml中定义的,如何在xml文件中引入schema详见后文.
这个片断:xmlns="http://www.w3school.com.cn"
指出本schema中,默认的命名空间是 "http://www.w3school.com.cn"。
这个片断:elementFormDefault="qualified"
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
...
...
省略的部分表示具体定义的xml文档的结构,具体教程参考:
http://www.w3school.com.cn/schema/index.asp
下面是一个完整的.xsd文件定义的一个schema:
note.xsd
<?xml version="1.0"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string" />
<xs:element name="from" type="xs:string" />
<xs:element name="heading" type="xs:string" />
<xs:element name="body" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
下面是一个使用上面note.xsd来定义的xml文件,note.xml
<?xml version="1.0"?>
<qq:note
xmlns:qq="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<qq:to>George</qq:to>
<qq:from>John</qq:from>
<qq:heading>Reminder</qq:heading>
<qq:body>Don't forget the meeting!</qq:body>
</qq:note>
注意,xmlns:qq="http://www.w3school.com.cn" 这里声明了一个命名空间,
和xsd文件中的targetNamespace是一致的.
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 这个是固定的,表示使用的验证规范
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
这个把这里定义的命名空间xmlns:qq的uri和xsd文件关联起来,以便引入定义好的note.xsd文件
来约束note.xml的文档结构.
需要导入dom4j包.
package test.dbtool.utils;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
/**
* Java XML校验测试
*
* @author leizhimin,2008-9-4 14:42:35
*/
public class ValidataxMLTest
{
public static void main(String[] args)
{
validateXMLByXSD();
validateXMLByDTD();
}
/**
* 通过XSD(XML Schema)校验XML
*/
public static void validateXMLByXSD()
{
String xmlFileName = "D:\\E\\JSP\\Tool4DBJAXBDemo\\src\\note.xml";
String xsdFileName = "D:\\E\\JSP\\Tool4DBJAXBDemo\\src\\note.xsd";
try
{
// 创建默认的XML错误处理器
XMLErrorHandler errorHandler = new XMLErrorHandler();
// 获取基于 SAX 的解析器的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
// 解析器在解析时验证 XML 内容。
factory.setValidating(true);
// 指定由此代码生成的解析器将提供对 XML 名称空间的支持。
factory.setNamespaceAware(true);
// 使用当前配置的工厂参数创建 SAXParser 的一个新实例。
SAXParser parser = factory.newSAXParser();
// 创建一个读取工具
SAXReader xmlReader = new SAXReader();
// 获取要校验xml文档实例
Document xmlDocument = (Document) xmlReader.read(new File(xmlFileName));
// 设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2001/XMLSchema");
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource","file:" + xsdFileName);
// 创建一个SAXValidator校验工具,并设置校验工具的属性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
// 设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
validator.setErrorHandler(errorHandler);
// 校验
validator.validate(xmlDocument);
XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
if (errorHandler.getErrors().hasContent())
{
System.out.println("XML文件通过XSD文件校验失败!");
writer.write(errorHandler.getErrors());
}
else
{
System.out.println("Good! XML文件通过XSD文件校验成功!");
}
}
catch (Exception ex)
{
System.out.println("XML文件: " + xmlFileName + " 通过XSD文件:" + xsdFileName + "检验失败。\n原因: " + ex.getMessage());
ex.printStackTrace();
}
}
/**
* 通过DTD校验XML
*/
public static void validateXMLByDTD()
{
// todo:暂时不用,以后再说吧
}
}