XML验证实践(DTD和Schema)

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

        }

    }

}

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qian_348840260/archive/2010/03/19/5396061.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值