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

本文详细介绍了如何使用Java结合XSD文件进行XML文档的校验,包括通过命令行工具生成XSD文件,以及Java代码实现XML校验的过程,最后展示了更友好的错误信息处理方式。
Llama Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

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

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值