fly project:验证 XML 是否符合 Schema
来源:百度文库 编辑:中财网 时间:2024/05/04 05:44:31
为了验证 XML 文档的合法性,通常需要对文档进行验证,要么符合 DTD,要么符合 Schema。在以前的 JAXP 版本中,验证(Validation)是作为解析器(Parser)的一个功能特征来提供的。
JAXP 的 Validation API 把 XML Parser 和 Validator 解耦合了。这样获得了两个好处:
1、支持更多的 Schema 语言
2、在运行时 XML 与 Schema 更容易耦合在一起
以下是一个小例程,演示了用 Validation API 验证 XML 文件是否符合 Schema:
import java.io.*;
import javax.xml.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
public class TestMain {
public static void main(String[] args) {
try {
String strLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(strLang);
InputStream isSchema = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal.xsd");
StreamSource ss = new StreamSource(isSchema);
Schema schema = factory.newSchema(ss);
Validator validator = schema.newValidator();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream isXML = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal-schema.xml");
Document document = db.parse(isXML);
DOMSource source = new DOMSource(document);
validator.validate(source);
System.out.println("Result : Valid!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Result : Invalid!");
}
}
}
运行环境:JDK 1.4.2 + Xerces 2.8.0 for Java。
有一个小地方要注意,如果用的是 DOMSource,程序中必须加上:dbf.setNamespaceAware(true);
否则会出错,找不到根节点元素的定义,例如:
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'personnel'.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)
at TestMain.main(TestMain.java:32)
当然,如果用的是 StreamSource,就不需要这么费劲了。如下:
……
InputStream isXML = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal-schema.xml");
/*
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(isXML);
DOMSource source = new DOMSource(document);
*/
StreamSource source = new StreamSource(isXML);
validator.validate(source);
……
附源代码下载。是一个 Eclipse 工程。为了减少字节数,把 lib 目录下 Xerces 2.8.0 for Java 的 Jar 包删除掉了。下载后,请自行加上:xml-apis.jar 和 xercesImpl.jar。
Xerces 的下载地址为:[url]http://xerces.apache.org[/url]
JAXP 的 Validation API 把 XML Parser 和 Validator 解耦合了。这样获得了两个好处:
1、支持更多的 Schema 语言
2、在运行时 XML 与 Schema 更容易耦合在一起
以下是一个小例程,演示了用 Validation API 验证 XML 文件是否符合 Schema:
import java.io.*;
import javax.xml.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
public class TestMain {
public static void main(String[] args) {
try {
String strLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(strLang);
InputStream isSchema = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal.xsd");
StreamSource ss = new StreamSource(isSchema);
Schema schema = factory.newSchema(ss);
Validator validator = schema.newValidator();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream isXML = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal-schema.xml");
Document document = db.parse(isXML);
DOMSource source = new DOMSource(document);
validator.validate(source);
System.out.println("Result : Valid!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Result : Invalid!");
}
}
}
运行环境:JDK 1.4.2 + Xerces 2.8.0 for Java。
有一个小地方要注意,如果用的是 DOMSource,程序中必须加上:dbf.setNamespaceAware(true);
否则会出错,找不到根节点元素的定义,例如:
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'personnel'.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)
at TestMain.main(TestMain.java:32)
当然,如果用的是 StreamSource,就不需要这么费劲了。如下:
……
InputStream isXML = ClassLoader.getSystemClassLoader()
.getResourceAsStream("personal-schema.xml");
/*
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(isXML);
DOMSource source = new DOMSource(document);
*/
StreamSource source = new StreamSource(isXML);
validator.validate(source);
……
附源代码下载。是一个 Eclipse 工程。为了减少字节数,把 lib 目录下 Xerces 2.8.0 for Java 的 Jar 包删除掉了。下载后,请自行加上:xml-apis.jar 和 xercesImpl.jar。
Xerces 的下载地址为:[url]http://xerces.apache.org[/url]
XML中schema是什么意思?
关于XML schema的问题
根据news.xsd写一个news.xml文档,元素内容要符合schema文件的定义,具体内容自己编辑。
.net中,怎样使用一个Xml Schema或者DTD去校验一个xml的格式是否正确?
xml怎么样去引用xsd schema呀???
Oracle schema 和 XML schema 的分别是什么东东?有何区别?
这个格式的xml文件怎么用schema定义
XML Schema有没有什么通俗点的理解方法??
编写XML文档,还可以编写Schema文件,该用什么软件呢??
什么是schema?
j计划生育是否符合人性?
民间高利贷是否符合法律规定
PA6是否符合食品安全标准?
Altova Enterprise xml suite 2006 (xmlspy) 的网络验证问题
Altova Enterprise xml suite 2006 (xmlspy) 的网络验证问题
Altova Enterprise xml suite 2006 (xmlspy) 的网络验证问题
关于schema 和 wsdl?
国企垄断是否符合市场经济要求?
每周工作六天是否符合国家规定?
辩论:超级女生是否符合艺术发展规律
海贼王动画是否符合漫画?
嘉实多磁护机油是否符合大众VW50200标准?
学营销的是否符合我?
《帝女花》中的故事情节,是否符合史实?