参考资料:
dom4j API DOC (到SourceForge.net 上下载dom4j-1.6.1.zip,下载后就会在里面找到doc了)
dom4j 和 xerces-2.4.0 利用schema验证xml问题
http://www2.matrix.org.cn/thread.shtml;jsessionid=E282E65FCE68F3A4D25B0962DCE6F813?topicId=45719&forumId=13
DOM4J 验证XML Schema (我要的成功 的blog)
http://kingofhawks.spaces.live.com/?_c11_BlogPart_blogpart=blogview&_c=BlogPart&partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet
Xerces-Java 2 中的 XML Schema 验证 (登录:jchunmei19@126.com/05602050)
http://www-128.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=84985
xsd验证
一.java中如何使用dom4j的SAXReader实现验证.
1.xml验证用于验证符合xml语法格式的xml文件是否符合特定的xml Schema以及数据类型等,xml验证主要有两种方式,DTD和XSD,现采用的是XSD方式。xsd文件的语法格式和编写参考“xsd学习笔记”这篇,现在介绍准备好了xsd文件之后,java中如何使用dom4j的SAXReader实现验证。下面进入正文:
2.任何技术的介绍,代码都是最直观的,下面就来直接看SAXReader实现验证的代码:
public static boolean isXmlOK(String xsdFile, byte[] tagetXml) throws SAXException, IOException, DocumentException
{
boolean flag = true;
SAXReader reader = new SAXReader();
reader.setValidation(true);
reader.setFeature("http://xml.org/sax/features/validation", true);
reader.setFeature("http://apache.org/xml/features/validation/schema", true);
reader.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", xsdFile);
//reader.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", "templateXMLSchema.xsd");
XMLErrorHandler errorHandler = new XMLErrorHandler();
reader.setErrorHandler(errorHandler);
InputStream in = new ByteArrayInputStream(tagetXml);
InputStreamReader utf8In=new InputStreamReader(in,"utf-8");
//Document document = reader.read(in);
reader.read(utf8In);
XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
if (errorHandler.getErrors().hasContent()) {
flag = false;
//writer.write(errorHandler.getErrors());
} else {
System.out.println("Xml is OK!.");
}
return flag;
}
3.对上述代码的注释:
主要思路:设置SAXReader支持验证 -〉得到xsd文件的路径 -〉读入要验证的xml文件 -〉OK!;
验证流程:
-〉设置支持验证;
SAXReader reader = new SAXReader();
reader.setValidation(true);
-〉设置支持验证的几个feature的值;
注明:SAXReader的各个函数的作用和用法详见dom4j api doc。
-〉设置xsd文件路径的Property值,这样就可以依据xsd文件进行验证了;
语法格式:public void setProperty(java.lang.String name,java.lang.Object value)
-〉读入要验证的.xml文件或xml格式的字符串;
*若验证的是.xml文件,则reader.read(param)中的param为xml文件的路径,这个xml文件的路径应该设置为相对路径;(xml相对路径如何获取和表示这个问题有待解决)
*若验证的是字符串,则要把字符串转换为InputStream类型,这是read方法的参数要求。(详见dom4j api doc)
那么怎么把字符串转换为InputStream类型呢?
法一:
我们知道,ByteArrayInputStream(byte[] buf)方法可以使byte字节码转为InputStream流,那么我们先通过getBytes()方法把字符串转为byte[]类型,再通过ByteArrayInputStream(byte[] buf)方法转为InputStream流就ok了!
String xmldescription = (String) obj;
byte[] xmlMsgBytes =xmldescription.getBytes();
……
InputStream in = new ByteArrayInputStream(xmlMsgBytes);
法二:
InputStream in=TAEncodeDecoderFactory.class.getResourceAsStream("encoder_decoder_mapping.xml");
-〉这样SAXReader就可以根据xsd文件对所读入的xml信息进行验证了!
-〉接下来,还可以使用XMLErrorHandler和XMLWriter这两个类在控制台输出错误提示信息;
-〉xml validation is ok!
二.内容补充:
参考资料“DOM4J 验证XML Schema (我要的成功 的blog)
http://kingofhawks.spaces.live.com/?_c11_BlogPart_blogpart=blogview&_c=BlogPart&partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet”中提到“如何读取Class path下的xsd文件:需要实现EntityResolver 接口,在resolveEntity()中读取当前类路径下的xsd文件,并返回InputSource instance.”的问题,下面谈谈对EntityResolver的理解:
这段代码是关于实体解析器用来解析外部实体引用的,在这里并不需要。
注释:
1.关于什么是实体,什么是外部实体,详见资料:
xml实用大全
http://phpso.com/data/htm/XML/408.htm
2.关于实体解析器如何使用,详见资料:
技巧:使用实体解析器
http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipent/index.html
三.尚未解决的问题:
如何获取xml相对路径?