参考资料:
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相对路径?