`

XSD验证XML

    博客分类:
  • xml
阅读更多
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的合法性

    XSD验证XML的合法性: 1. **解析XSD**:首先,解析XSD文件以获取其定义的规则。 2. **匹配元素和属性**:遍历XML文档,检查每个元素和属性是否在XSD中定义,且格式正确。 3. **数据类型检查**:验证XML元素的值是否...

    XML验证器(XSD验证XML)

    XML验证器(XSD验证XML)是指一种工具或程序,它能够检查XML文档是否符合预先定义的XSD模式。这个附带Delphi7源码的XML验证器,是为了解决在Delphi开发环境中对XML数据进行验证的需求。Delphi是一种流行的面向对象的...

    通过xsd验证xml

    在开发过程中,通过XSD验证XML文档是非常重要的一步,可以确保数据符合预设的规则。 在Visual Studio 2005(VS2005)中,使用C++来实现XML文档与XSD模式的验证是一个常见的需求。VS2005提供了一套强大的XML工具和库...

    xsd验证xml - 含

    标题中的“xsd验证xml”指的是使用XML Schema Definition (XSD) 对XML文档进行验证的过程。在XML中,XSD是一种规范,它定义了XML文档的结构和数据类型,确保XML文档的数据符合预设的规则,从而提高数据的准确性和...

    纯Java(swing)写的xsd验证xml - 含

    标题中的“纯Java(swing)写的xsd验证xml”是指使用Java编程语言,结合Swing图形用户界面库,开发的一个工具,用于验证XML文档是否符合指定的XSD(XML Schema Definition)规范。XML Schema是W3C推荐的一种XML文档...

    C#验证xml是否满足xsd规则

    以下是关于"C#验证XML是否满足XSD规则"的详细知识点: 1. **XML和XSD基础**: - XML:XML是一种自描述性的文本格式,它允许我们创建自定义的标签来表示数据。XML文档结构严谨,包含元素、属性、文本内容等。 - ...

    根据XSD检查XML并修复

    附件是我写的一个demo程序,该程序的功能是根据一个定义好的XSD文件去检查指定的XML文件是否满足XSD的约束。 这里的约束比标准的约束要弱一些,比如:这里的约束不限制元素出现的顺序,只关心有没有这个元素。 我...

    6、xsd验证xml文件的java代码

    NULL 博文链接:https://nickfover.iteye.com/blog/2155663

    验证XSD和XML文件的小工具

    验证xml文件与xsd是否匹配

    xml文件转xsd文件

    将XML文件转换为XSD文件,主要是为了更好地管理和验证XML文档的结构,确保数据的一致性和准确性,同时也便于生成对应的Java类,以进行程序开发。 在Java开发中,经常需要处理XML数据。有了XSD文件,开发者可以使用...

    go-xsd-validate:基于libxml2的go的Xsd验证

    该软件包的目标是将xsd文件预加载到内存中,并使用libxml2(快速)验证xml,例如xml服务端点或api路由器的后主体。 在撰写本文时,我在github上找到的类似软件包没有提供错误详细信息,或者卡在了负载下。 除了提供...

    利用xsd校验xml

    在标题“利用xsd校验xml”中,我们讨论的核心是通过XML Schema(XSD)来验证XML文档是否符合预定义的模式。这个过程是确保XML数据有效性和正确性的重要步骤,特别是当XML被用作数据交换或者在复杂的系统间通信时。 ...

    java生成xsd,xml示例

    XML用于结构化数据的存储和传输,而XSD则为XML文档提供了语义验证的规则。本教程将详细介绍如何在Java环境中生成XML和XSD文件。 XML是一种标记语言,它允许我们在文档中定义元素、属性和结构。这些元素和属性描述了...

    Xsd转换xml

    一旦有了XSD,我们就可以根据这个模式验证XML文档,确保其符合规范。 在“Xsd转换xml”这个场景中,通常指的是利用XSD文件生成对应的XML实例文档。这个过程是基于XSD的规则,自动生成一个符合该模式的XML文档。这在...

    用XSD完成xml有效性的验证

    在开发过程中,验证XML文档的有效性是非常重要的一步,可以预防因数据格式错误导致的问题。 在VS2005中,我们可以使用C#语言来实现XSD对XML的验证。C#提供了丰富的类库,如System.Xml和System.Xml.Schema,这些类库...

    XML生成XSD的方法

    ### XML生成XSD的方法 #### 一、引言 在处理结构化数据时,XML(可扩展标记语言)因其灵活性而被广泛采用。为了确保XML文档遵循特定的格式和规则,通常会用到XSD(XML Schema Definition)来定义XML文档的结构。...

    在XSD指导下创建XML,不是生成示例xml

    4. **生成XML**:当所有输入都通过验证后,编辑器将这些数据转化为符合XSD结构的XML元素和属性,形成完整的XML文档。 除了IETM系统,这种根据XSD创建XML的方法也广泛应用于其他场景,如数据交换、Web服务、配置文件...

    XSD(XML Schemas Definition)

    XML Schema语言也就是XML Schema Definition (XSD)。 XML Schema描述了XML文档的结构。可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XML Schema指定一个XML文档...

    根据xsd排序xml

    之前做一个开发项目,要校验xml报文合法性,根据Schema使用javax.xml.validation.Validator倒是能验证XML,但是要求是顺序一致才行,一直没找到合适的排序,就自己写了一个排序代码,根据xsd规范文件给xml排序,有...

Global site tag (gtag.js) - Google Analytics