java验证xml是否规范
2010年2月10日- 作为读者评论的后续活动,作者对Validation下的最后一段进行了更新,只有模式是线程安全的,而验证程序和模式工厂则不是。
验证是一个强大的工具。 它使您能够快速检查输入内容是否大致符合您的期望,并快速拒绝任何与流程无法处理的文档。 如果数据有问题,最好早发现。
在可扩展标记语言(XML)的上下文中,验证通常涉及以多种架构语言(例如,万维网联合会(W3C)XML架构语言(XSD),RELAX NG,文档类型)中的任何一种来编写文档内容的详细规范。定义(DTD)和Schematron。 有时,验证是在解析时执行的,有时是在解析之后立即执行的。 但是,通常是在对输入进行任何进一步处理之前完成。 (此描述用粗笔描画-有例外。)
直到最近,程序要求进行验证的确切应用程序编程接口(API)随架构语言和解析器的不同而变化。 通常在XML的简单API(SAX),文档对象模型(DOM)和XML处理的Java™API(JAXP)中将DTD和XSD作为配置选项进行访问。 RELAX NG需要自定义库和API。 Schematron可能会使用XML(TrAX)的Transformations API; 甚至其他模式语言也要求程序员学习更多的API,即使它们执行的基本操作相同。
Java 5引入了javax.xml.validation
包,以向验证服务提供独立于模式语言的接口。 当单独安装JAXP 1.3时,此包在Java 1.3和更高版本中也可用。 在其他产品中,该库的实现包含在Xerces 2.8中。
验证方式
javax.xml.validation
API使用三个类来验证文档: SchemaFactory
, Schema
和Validator
。 它还广泛使用了TrAX的javax.xml.transform.Source
接口来表示XML文档。 简而言之, SchemaFactory
会从中读取创建Schema
对象的架构文档(通常是XML文件)。 Schema
对象创建一个Validator
对象。 最后, Validator
对象验证表示为Source
的XML文档。
清单1显示了一个简单的程序,用于根据DocBook XSD模式验证在命令行上输入的URL。
清单1.验证可扩展超文本标记语言(XHTML)文档
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;
public class DocbookXSDCheck {
public static void main(String[] args) throws SAXException, IOException {
// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
// 2. Compile the schema.
// Here the schema is loaded from a java.io.File, but you could use
// a java.net.URL or a javax.xml.transform.Source instead.
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
// 4. Parse the document you want to check.
Source source = new StreamSource(args[0]);
// 5. Check the document
try {
validator.validate(source);
System.out.println(args[0] + " is valid.");
}
catch (SAXException ex) {
System.out.println(args[0] + " is not valid because ");
System.out.println(ex.getMessage());
}
}
}
这是使用Java 2 Software Development Kit(JDK)5.0附带的Xerces版本检查无效文档时的一些典型输出:
file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.
您可以轻松更改要验证的架构,要验证的文档,甚至架构语言。 但是,在所有情况下,验证都遵循以下五个步骤&