package com.songjy.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
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;
import org.xml.sax.SAXException;
public class ValidateXML {
public boolean validate_xml(String xsd_file_path, String xml_file_path)
throws SAXException, IOException {
// 建立schema工厂
SchemaFactory schemaFactory = SchemaFactory
.newInstance("http://www.w3.org/2001/XMLSchema");
// 建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证
File schemaFile = new File(xsd_file_path);
// 利用schema工厂,接收验证文档文件对象生成Schema对象
Schema schema = schemaFactory.newSchema(schemaFile);
// 通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
Validator validator = schema.newValidator();
// 得到验证的数据源
Source source = new StreamSource(xml_file_path);
// 开始验证,成功输出success!!!,失败输出fail
try {
validator.validate(source);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public void xml_validate(String xsd_file_path, String xml_file_path) {
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(
xml_file_path));
// 设置 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:" + xsd_file_path);
// 创建一个SAXValidator校验工具,并设置校验工具的属性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
// 设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。
validator.setErrorHandler(errorHandler);
// 校验
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文件: " + xml_file_path + " 通过XSD文件:"
+ xsd_file_path + "检验失败。\n原因: " + ex.getMessage());
ex.printStackTrace();
}
}
}
XSD示例文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Test">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="NewData">
<xs:complexType>
<xs:complexContent>
<xs:extension base="dataElementType">
<xs:attributeGroup ref="dataRequiredAttributeType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="ModifyData">
<xs:complexType>
<xs:complexContent>
<xs:extension base="dataElementType">
<xs:attributeGroup ref="dataRequiredAttributeType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="DeleteData">
<xs:complexType>
<xs:complexContent>
<xs:extension base="dataElementType">
<xs:attributeGroup ref="dataRequiredAttributeType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="id" type="stringRequireType24" use="required" />
</xs:complexType>
</xs:element>
<xs:attributeGroup name="dataRequiredAttributeType">
</xs:attributeGroup>
<xs:complexType name="dataElementType">
<xs:all>
<xs:element name="deviceTypeId" type="stringType10"
minOccurs="0" />
<xs:element name="iconName" type="stringType100"
minOccurs="0" />
</xs:all>
</xs:complexType>
<xs:simpleType name="stringType10">
<xs:restriction base="xs:string">
<xs:pattern value="([0-9])*" />
<xs:minLength value="0" />
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="stringType100">
<xs:restriction base="xs:string">
<xs:minLength value="0" />
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="stringRequireType24">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="24" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="stringRequireType50">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
xml示例文件
<?xml version="1.0" encoding="UTF-8"?>
<Test id="F2009045002100N03030100">
<NewData>
<deviceTypeId>16135</deviceTypeId>
<iconName>变电站.gif</iconName>
</NewData>
</Test>
Xsd文件验证xml的java实现
Java通过XML Schema校验XML
使用反射递归校验XML对象空(null)字段
package com.wasu.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang3.StringUtils;
public class XmlValidate {
public static final String ISNULL = "节点为空(或不存在)";
public static Map<String, String> validate(Object obj) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Map<String, String> map = new HashMap<String, String>();
if (null != obj) {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
if (false == field.isAnnotationPresent(XmlElement.class))
continue;// 假如没有注解XmlElement则跳过
XmlElement e = field.getAnnotation(XmlElement.class);
if (false == e.required())
continue;// 假如不是必须节点则跳过
String name = StringUtils.isBlank(e.name()) ? field.getName() : e.name();
Object v = getProperty(obj, field.getName());
Class<?> t = field.getType();
if (null == v) {
map.put(name, ISNULL);
continue;
}
if (t == String.class && StringUtils.isBlank(v.toString())) {
map.put(name, ISNULL);
continue;
}
if (t.getPackage().getName().startsWith("java"))
continue;
map.putAll(validate(v));
}
}
return map;
}
public static Object getProperty(Object obj, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
if (null != obj && StringUtils.isNotBlank(name)) {
Method get = obj.getClass().getMethod("get" + StringUtils.capitalize(name), parameterTypes);
return get.invoke(obj, args);
}
return null;
}
private static final Class<?>[] parameterTypes = {};
private static final Object[] args = {};
}
分享到:
相关推荐
xml 文件与xsd文件的转化以及xsd验证xml的合法性
在vs2005里,用vc实现xsd对xml的检测
XML验证器(XSD验证XML)附Delphi7源码 http://blog.csdn.net/akof1314/article/details/6860264 有介绍
附件是我写的一个demo程序,该程序的功能是根据一个定义好的XSD文件去检查指定的XML文件是否满足XSD的约束。 这里的约束比标准的约束要弱一些,比如:这里的约束不限制元素出现的顺序,只关心有没有这个元素。 我...
NULL 博文链接:https://nickfover.iteye.com/blog/2155663
C#雁阵xml是否满足xsd规则
NULL 博文链接:https://zhoujianboy.iteye.com/blog/702889
验证xml文件与xsd是否匹配
在vs2005里,使用c#语言完成xsd验证xml语法
NULL 博文链接:https://zhoujianboy.iteye.com/blog/816343
该软件包的目标是将xsd文件预加载到内存中,并使用libxml2(快速)验证xml,例如xml服务端点或api路由器的后主体。 在撰写本文时,我在github上找到的类似软件包没有提供错误详细信息,或者卡在了负载下。 除了提供...
XML Schema语言也就是XML Schema Definition (XSD)。 XML Schema描述了XML文档的结构。可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XML Schema指定一个XML文档...
之前做一个开发项目,要校验xml报文合法性,根据Schema使用javax.xml.validation.Validator倒是能验证XML,但是要求是顺序一致才行,一直没找到合适的排序,就自己写了一个排序代码,根据xsd规范文件给xml排序,有...
方便对xml中任意节(多个同名节点)点属性进行获取、设置。 /// /// 设置指定节点的属性 /// /// <param name="xmlContent">xml结构 /// 父节点 /// 父节点所处同名节点的位置 为0表明只有一个该节点 /// ...
输入xsd代码,根据xsd代码验证输入的xml是否符合xsd。
RSpec::XSD概述RSpec 匹配器,用于确保针对给定 XSD 验证 XML安装将此行添加到应用程序的 Gemfile 中: group :test do gem 'rspec-xsd'end 然后执行: $ bundle或者自己安装: $ gem install rspec-xsd用法在你的 ...
XSD验证器 根据XML模式(xsd文件)快速轻松地验证XML文件。 需要安装Java。 在Mac和Linux上的用法: ./xsdv.sh test.xsd test.xml Windows命令提示符下的用法: xsdv test.xsd test.xml 如果您发现它有用并且...
处理任何大尺寸的XML(甚至以千兆字节为单位),因为它流xml 从标准输入读取xml并输出到标准输出使用XSD验证XML 在任何指定元素处分割数据(可以有任何分割数) 在单个文件中处理多个文档(在流连续数据时很有用) ...
用xsd验证xml,将xml生成bean对象