XML验证实践(DTD和Schema)
来源:互联网 发布:ps软件官方免费下载 编辑:程序博客网 时间:2024/05/16 02:58
DTD验证方案:
XML文档:Employee.xml
<?xmlversion="1.0"?>
<!DOCTYPEEmployeeSYSTEM"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
<!ELEMENTEmployee (Emp_Id,Emp_Name,Emp_E-mail)>
<!ELEMENTEmp_Id (#PCDATA)>
<!ELEMENTEmp_Name (#PCDATA)>
<!ELEMENTEmp_E-mail (#PCDATA)>
/**
Inthissection,youwilllearntovalidateaxmlfileagainsta DTD(DocumentTypeDefinition) usingtheDOMAPIs.
ADTDdefines thedocumentstructurewithalistoflegalelementsandattributes.
Descriptionofprogram:
ValidatingaXMLfileagainstaDTDneedsaxmlfileanditsDTDdocument.
Firstofallconstructawell-formedxmlfilealongwithaDTDfile.
ThisDTDfiledefinesallelementstokeepinthexmlfile.
Aftercreatingthese,weparsethexmlfileusingtheparse()methodandgeneratesaDocumentobjecttree.
ThesetErrorHandler()methodinvokesanobjectofDoucmentBuilder.
EnablethesetValidating()methodofthefactoryto"true".
Ifwepass'true'theparserwillvalidatexmldocumentsotherwisenot.
Tovalidatexmlfile,passtheDTDfileassetOutputProperty(OutputKeys.DOCTYPE_SYSTEM,"Employee.dtd")inthetransformerobject.
*/
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;
publicclassDOMValidateDTD {
publicstaticvoid 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
publicvoid fatalError(SAXParseException exception)throws SAXException {exception.printStackTrace(); }
//Validation errors
publicvoid 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
publicvoid 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
<?xmlversion="1.0"?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:elementname="note">
<xs:complexType>
<xs:sequence>
<xs:elementname="to"type="xs:string"minOccurs="1"/>
<xs:elementname="from"type="xs:string"/>
<xs:elementname="heading"type="xs:string"/>
<xs:elementname="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(XMLSchema)校验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();
}
}
}
- XML验证实践(DTD和Schema)
- DTD和XML Schema
- DTD和XML Schema
- XML、DTD和Schema
- xml基础、DTD验证、Schema验证(备忘)
- xml基础、DTD验证、Schema验证(备忘)
- XML DTD和XML Schema
- XML Schema和XML DTD
- XML DTD和XML Schema
- XML DTD和XML Schema
- XML DTD和XML Schema
- xml基础、DTD验证、Schema验证
- dom4j通过dtd或者schema验证xml
- DTD和XML Schema(XML 模式)的比较
- 【转载】XML DTD和XML Schema
- XML中Schema和DTD的区别
- xml语义约束:DTD和Schema
- XML的DTD约束和Schema约束
- C# WinForm开发系列 - Thread/Delegate/Event
- 从“蚁族”现象联想到的招聘商机
- CRM SFA
- SQL Server中函数GROUPING的用法
- What is Bash翻译
- XML验证实践(DTD和Schema)
- SQL一些常用列子
- CMMI串讲
- QTP测试Windows计算器
- Eclipse内存优化 -Xms128m -Xmx512m
- 繁花落京
- unix 下send和recv函数详解 (转载)
- JAVA基础:eclipse.ini中各个参数的作用计算机二级考试
- js正则 货币 整型