DTD验证方案:
XML文档:Employee.xml
<?xml version = "1.0" ?>
<!DOCTYPE Employee SYSTEM "Employee.dtd">
<Employee>
<Emp_Id> E-001 </Emp_Id>
<Emp_Name> Vinod </Emp_Name>
<Emp_E-mail> Vinod1@yahoo.com </Emp_E-mail>
</Employee>
DTD文档:Employee.dtd
<!ELEMENT Employee (Emp_Id, Emp_Name, Emp_E-mail)>
<!ELEMENT Emp_Id (#PCDATA)>
<!ELEMENT Emp_Name (#PCDATA)>
<!ELEMENT Emp_E-mail (#PCDATA)>
/**
In this section, you will learn to validate a xml file against a DTD (Document Type Definition) using the DOM APIs.
A DTD defines the document structure with a list of legal elements and attributes.
Description of program:
Validating a XML file against a DTD needs a xml file and its DTD document.
First of all construct a well-formed xml file along with a DTD file .
This DTD file defines all elements to keep in the xml file.
After creating these, we parse the xml file using the parse() method and generates a Document object tree.
The setErrorHandler() method invokes an object of DoucmentBuilder.
Enable the setValidating() method of the factory to "true".
If we pass 'true' the parser will validate xml documents otherwise not.
To validate xml file , pass the DTD file as setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "Employee.dtd") in the transformer object.
*/
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class DOMValidateDTD {
public static void main(String args[]) {
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new org.xml.sax.ErrorHandler() {
//Ignore the fatal errors
public void fatalError(SAXParseException exception)throws SAXException {exception.printStackTrace(); }
//Validation errors
public void error(SAXParseException e)throws SAXParseException {
System.out.println("Error at " +e.getLineNumber() + " line.");
System.out.println(e.getMessage());
e.printStackTrace();
System.exit(0);
}
//Show warnings
public void warning(SAXParseException err)throws SAXParseException{
System.out.println(err.getMessage());
err.printStackTrace();
System.exit(0);
}
});
URL url = DOMValidateDTD.class.getClassLoader().getResource("Employee.xml");
//eclipse和cmd都可以执行通过
Document xmlDocument = builder.parse(new File(url.getFile()));
//cmd可以执行通过,但是eclipse执行时报错,说找不到对应的dtd文件,折腾了半天也没有搞出什么原因
//Document xmlDocument = builder.parse(new FileInputStream(url.getFile()));
DOMSource source = new DOMSource(xmlDocument);
StreamResult result = new StreamResult(System.out);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "Employee.dtd");
transformer.transform(source, result);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
--------------------------------------------------------------------------------
Schema验证方案:
XML文档:node.xml
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema" >
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting this weekend!</body>
</note>
Schema文档:node.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" minOccurs="1"/>
<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>
JAVA验证文件:DOMValidateSchema.java
import java.io.File;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
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;
public class DOMValidateSchema {
public static void main(String[] args) {
validateXMLByXSD();
}
/**
* 通过XSD(XML Schema)校验XML
*/
public static void validateXMLByXSD() {
URL xmlUrl = DOMValidateSchema.class.getClassLoader().getResource("note.xml");
URL xsdUrl = DOMValidateSchema.class.getClassLoader().getResource("note.xsd");
try {
//获取基于 SAX 的解析器的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
//解析器在解析时验证 XML 内容。
factory.setValidating(true);
//指定由此代码生成的解析器将提供对 XML 名称空间的支持。
factory.setNamespaceAware(true);
//使用当前配置的工厂参数创建 SAXParser 的一个新实例。
SAXParser parser = factory.newSAXParser();
//设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。
//jdk1.6环境验证通过,jdk1.4环境下抛出org.xml.sax.SAXNotRecognizedException异常,原因在于jdk1.4中的SAXParserFactory版本低
//与http://java.sun.com/xml/jaxp/properties/schemaLanguage属性的设置不匹配的原因,解决办法
//1. 下载Apache的SAXParserFactoryImpl.jar,并在%JAVA_HOME%\jre\lib文件夹下面,建立一个jaxp.properties文件,
//内容只有一句 javax.xml.parsers.SAXParserFactory: org.apache.xerces.jaxp.SAXParserFactoryImpl
//2.找到xercesImpl.jar,复制到%JAVA_HOME%\jre\lib\endorsed下面(没有这个目录就创建这个目录),问题解决。
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:" + xsdUrl.getFile());
//创建一个SAXValidator校验工具,并设置校验工具的属性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
//创建默认的XML错误处理器
XMLErrorHandler errorHandler = new XMLErrorHandler();
//设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
validator.setErrorHandler(errorHandler);
//创建一个读取工具
SAXReader xmlReader = new SAXReader();
//获取要校验xml文档实例
Document xmlDocument = (Document) xmlReader.read(new File(xmlUrl.getFile()));
//校验
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文件: " + xmlUrl.getFile() + " 通过XSD文件:" + xsdUrl.getFile() + "检验失败。\n原因: " + ex.getMessage());
ex.printStackTrace();
}
}
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/qian_348840260/archive/2010/03/19/5396061.aspx