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");

     //eclipsecmd都可以执行通过

     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();

   }

   /**

    *通过XSDXMLSchema)校验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.下载ApacheSAXParserFactoryImpl.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();

       }

   }

}