欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

验证基于dtd或xsd生成的xml的有效性

程序员文章站 2022-05-30 12:54:43
...

代码参考:

https://gitee.com/burns/ValidateXml.git

项目结构:

验证基于dtd或xsd生成的xml的有效性

关键代码

 

ValidateXMLDTD.java

package com.burns.validate.xml;


import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

public class ValidateXMLDTD {

    public static void main(String[] args) {
//        System.out.println("测试符合DTD规范的XML文件");
//        testPerson();

//        System.out.println("测试不符合DTD规范的XML文件");
//        testWorkder();

    }

    public static void testPerson() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(new java.io.FileInputStream("person.xml"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void testWorkder() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(new java.io.FileInputStream("worker.xml"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void testXml(String xmlPath){
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(new java.io.FileInputStream(xmlPath));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

ValidateXmlDtdTest.java

package com.burns.validate.xml;


public class ValidateXmlDtdTest {
	
	/**
	 * 
	     * @Title: main
	     * @Description: TODO(这里用一句话描述这个方法的作用)
	     * @param @param args 参数
	     * @return void 返回类型
	     * @throws
	     * 
	     * 需要注意xml中有第一dtd的信息:例如:
	     * <!DOCTYPE project PUBLIC "-//Mentor Graphics Corporation//Project 2012.1//EN" "C:/MentorGraphics/CHS2012/dtd/project.dtd">
	 */
	
    public static void main(String[] args){
    	
    	//有问题的xml
//        ValidateXMLDTD.testXml(ValidateXmlXsdTest.class.getClassLoader().getResource("Design2-1-1.xml").getPath());
    	//没问题的xml
//        ValidateXMLDTD.testXml(ValidateXmlXsdTest.class.getClassLoader().getResource("28-22-00_81__1589439843201.xml").getPath());
//        ValidateXMLDTD.testXml("D:\\work\\上飞院\\梅挺\\20200514\\28-22-00_81__1589439843201.xml");
//        ValidateXMLDTD.testXml("D:\\work\\上飞院\\梅挺\\20200514\\Design2-1-1.xml");
//        ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\javabean2xml_5.xml");
//        ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\javabean2xml_4.xml");
//        ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\sharedcomponent.xml");
    }
}

 

ValidateXmlXsdTest.java

package com.burns.validate.xml;

import org.dom4j.Document;
import org.dom4j.Element;
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;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
import java.util.List;

public class ValidateXmlXsdTest {
    public static void main(String[] args){
            validateXMLByXSD();
    }

    public static void validateXMLByXSD() {
        // 从类路径下读取文件
        URL xmlFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("import1_1.xml");
//        URL xmlFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("library_web_service_import_example2.xml");
        // 输出为file:/D:/MyWorkSpace/FirstWorkSpace/validate-xml-test/target/classes/test_schema.xsd
        String xsdFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("LibrarySchema2014.xsd").toString();

        try {
            //创建默认的XML错误处理器
            XMLErrorHandler errorHandler = new XMLErrorHandler();
            //获取基于 SAX 的解析器的实例
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //解析器在解析时验证 XML 内容。
            factory.setValidating(true);
            //指定由此代码生成的解析器将提供对 XML 名称空间的支持。
            factory.setNamespaceAware(true);
            //使用当前配置的工厂参数创建 SAXParser 的一个新实例。
            SAXParser parser = factory.newSAXParser();
            //创建一个读取工具
            SAXReader xmlReader = new SAXReader();
            //获取要校验xml文档实例
            Document xmlDocument = (Document) xmlReader.read(xmlFileName);
            //设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。
            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",xsdFileName);
            //创建一个SAXValidator校验工具,并设置校验工具的属性
            SAXValidator validator = new SAXValidator(parser.getXMLReader());
            //设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
            validator.setErrorHandler(errorHandler);
            //校验
            validator.validate(xmlDocument);

            // 错误输出方式1
            XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
            //如果错误信息不为空,说明校验失败,打印错误信息
            if (errorHandler.getErrors().hasContent()) {
                System.out.println("XML文件通过XSD文件校验失败!");
                writer.write(errorHandler.getErrors());
            } else {
                System.out.println("XML文件通过XSD文件校验成功!");
            }

            // 错误输出方式2
            System.out.println();
            StringBuilder errorMsg = new StringBuilder();
            if (errorHandler.getErrors().hasContent()) {
                List<Element> elements = errorHandler.getErrors().elements();
                for (Element element : elements) {
                    String line = String.valueOf(Integer.parseInt(element.attributeValue("line")) - 1);
                    String text = element.getText();
                    errorMsg.append("(第 " + line + "行出现错误) " + text+"\r\n");
                }
                errorMsg.append("XML文件通过XSD文件校验失败!");
                System.out.println(errorMsg.toString());
            }else {
                System.out.println("XML文件通过XSD文件校验成功!");
            }
        } catch (Exception ex) {
            System.out.println("XML文件: " + xmlFileName + " 通过XSD文件:" + xsdFileName + "检验失败。/n原因: " + ex.getMessage());
            ex.printStackTrace();
        }
    }

}