java schema校验_Java通过XSD(XML Schema)校验XML

  • Post author:
  • Post category:java

21b50ae70e18503be9689347a7d4412f.png

Tom

male

16

changjiang road

2.使用正确的XML文件自动生成XSD校验文件a.xsd,需要借助第三方jar包trang.jar,执行命令

java -jar trang.jar a.xml a.xsd

3.Java代码实现

package nnn;

import java.io.File;

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 ValidXML {

public static void main(String[] args) {

validateXMLByXSD();

}

/**

* 通过XSD(XML Schema)校验XML

*/

public static void validateXMLByXSD() {

String xmlFileName = “e:\test\a.xml”;

String xsdFileName = “e:\test\a.xsd”;

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(new File(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”,

“file:” + xsdFileName);

//创建一个SAXValidator校验工具,并设置校验工具的属性

SAXValidator validator = new SAXValidator(parser.getXMLReader());

//设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。

validator.setErrorHandler(errorHandler);

//校验

validator.validate(xmlDocument);

XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());

//如果错误信息不为空,说明校验失败,打印错误信息

if (errorHandler.getErrors().hasContent()) {

System.err.println(“XML文件通过XSD文件校验失败!”);

writer.write(errorHandler.getErrors());

} else {

System.err.println(“Good! XML文件通过XSD文件校验成功!”);

}

} catch (Exception ex) {

System.err.println(“XML文件: ” + xmlFileName + ” 通过XSD文件:” + xsdFileName + “检验失败。

原因: ” + ex.getMessage());

ex.printStackTrace();

}

}

}

校验结果:

显然这样的结果并不友好,

修改后代码:

package nnn;

import java.io.File;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.Node;

import org.dom4j.io.SAXReader;

import org.dom4j.io.SAXValidator;

import org.dom4j.util.XMLErrorHandler;

public class ValidXML {

public static void main(String[] args) {

validateXMLByXSD();

}

/**

* 通过XSD(XML Schema)校验XML

*/

public static void validateXMLByXSD() {

String xmlFileName = “e:\test\a.xml”;

String xsdFileName = “e:\test\a.xsd”;

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(new File(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”, “file:” + xsdFileName);

//创建一个SAXValidator校验工具,并设置校验工具的属性

SAXValidator validator = new SAXValidator(parser.getXMLReader());

//设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。

validator.setErrorHandler(errorHandler);

//校验

validator.validate(xmlDocument);

//            XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());

//如果错误信息不为空,说明校验失败,打印错误信息

if (errorHandler.getErrors().hasContent()) {

Element e = errorHandler.getErrors();

List list = e.content();

int count = 0;

String result = “”;

for (Node node : list) {

String error = node.getText().split(“:”)[1];

if (error.contains(“元素”) && error.contains(“无效”)) {

count++;

result += error + “

“;

}

}

System.err.println(“共有” + count + “处错误”);

System.err.println(result);

} else {

System.err.println(“Good! XML文件通过XSD文件校验成功!”);

}

} catch (Exception ex) {

System.err.println(“XML文件: ” + xmlFileName + ” 通过XSD文件:” + xsdFileName + “检验失败。

原因: ” + ex.getMessage());

ex.printStackTrace();

}

}

}

dom4j的maven依赖

org.dom4j

dom4j

2.1.1

————————————————

版权声明:本文为CSDN博主「灌南高手No1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u012843873/article/details/85756563


版权声明:本文为weixin_39556474原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。