1.Schema概要
XML是可扩展标记语言,也就是说其中的节点标记设置由用户定义生成。如果没有有效的办法来校验XML的合法性,往往会导致很多问题。因此xml通过校验达到合法性规范性,同时也可以对xml节点中的数据校验。
这次学习中,运用的XML校验是通过XML Schema(XSD)。其本身是一个XML文档,所以必须满足XML文档结构。在每个Schema文档中必须包含一个根元素。 
2.Schema文档结构 

#xml
<?xml version="1.0" encoding="GBK"?>
<note xmlns=""><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body>
</note>#schema
<?xml version="1.0" encoding="GBK"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="" xmlns="" elementFormDefault="qualified"><xs:element name="note"><xs:complexType><xs:sequence><xs:element name="to" type="xs:string"/><xs:element name="from" type="xs:string"/><xs:element name="heading" type="xs:string"/><xs:element name="body" type="xs:string"/></xs:sequence></xs:complexType></xs:element>
</xs:schema>

说明:

xmlns:xs=”http://www.w3.org/2001/XMLSchema”:显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema“。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:

targetNamespace=”” :显示被此 schema 定义的元素验证的XML来自的命名空间。

xmlns=”” :作用是赋予命名空间一个唯一的名称。

elementFormDefault=”qualified” :指目标XML是否遵循本Schema,qualified表示遵循,unqualified表示不遵循。
3.java代码实现
java中 javax.xml有自带可以生成schema的校验器,方法的理解调用基本上通过API学习。

SchemaFactory.API
http://www.cjsdn.net/Doc/JDK50/javax/xml/validation/SchemaFactory.html

#具体的实现块
private static String byXsd(String xmlString,String xsdString) throws SAXException, IOException {//从xml转换为字节流构造 StreamSourceSource xmlSource = new StreamSource(new ByteArrayInputStream(xmlString.getBytes()));Source xsdSource = new StreamSource(new ByteArrayInputStream(xsdString.getBytes()));StringWriter stringWriter = new StringWriter();PrintWriter printWriter = new PrintWriter(stringWriter);Result destResult = new StreamResult(printWriter);//查找支持指定模式语言的 SchemaFactory 的实现并返回它SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);//以相对应的xsd生成schema,解析作为模式的指定源并以模式形式返回它。Schema schema = factory.newSchema(xsdSource);//进行校验Validator validator = schema.newValidator();validator.validate(xmlSource, destResult);String desc = stringWriter.toString();printWriter.close();return desc;}
#这里得到的结果为打印成功,返回成功的xml字符串格式
<?xml version="1.0" encoding="UTF-8"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>
#另一种不需要返回xml的方式,可以这样实现
try {schema = factory.newSchema(xsdSource);Validator validator = schema.newValidator();validator.validate(xmlSource);} catch (SAXException | IOException e) {// TODO Auto-generated catch block// e.printStackTrace();System.out.println("Exception: " + e.getMessage());return false;}return true;
#所得结果可以是:validation result:true
#注意:validator.validate()这个方法返回类型为void,只进行校验,需要的返回信息都是代码中额外再实现的。

4.遇到的主要问题

Exception in thread “main” org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 28; cvc-elt.1: 找不到元素 ‘note’ 的声明。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)

这里最后的解决办法是,保持targetNamespacexmlns所指向的唯一命名空间一致,且xml中的也需要一致,这里最终我是设为空,则xml中的note处可不填,xsd中的命名空间都指向空。

注:初次实践时,遇到这个问题以为是xsd模板生成成功,而validator.validate(xmlSource)读取xml文档时无法读取到note节点。经过测试,发现猜测错误,问题出现的原因是方法读取xml的note节点而xsd模板没有生效成功。

XMl Schema校验相关推荐

  1. java实现xml的xsd验证_Java通过XML Schema校验XML

    首页 > 编程语言> 文章详细 Java通过XML Schema校验XML 2020-03-28 10:51:10阅读:77来源:互联网 Java通过XML Schema校验XML XML ...

  2. java通过schema校验xml

    之前在做项目时时常需要通过一些"小xml"传输或存储一些信息,然后就在读取的时候需要先判断xml数据是否符合要求,包括这次也是这样,不同的是 这次我设计了一个比较复杂的xml,结果 ...

  3. 使用DOM4J解析XML及采用Schema校验的方法

    使用DOM4J解析XML及采用Schema校验的方法 Validation Currently dom4j does not come with a validation engine. You ar ...

  4. Java实现xml文件的xsd校验(schema校验)

    JDK中的javax.xml包中有能进行schema校验的类库,但只能返回true或false,无法给出确切的错误信息. Dom4j中给出了几种schema校验的思路,本文实现其中一种. Dom4j在 ...

  5. 使用W3C XML Schema

    为什么80%的码农都做不了架构师?>>>    W3C XML Schema 定义语言是描述和约束XML文档内容的XML语言,W3C推荐使用W3C XML Schema. 本文介绍了 ...

  6. XML Schema全接触 (这里主要介绍W3C的Schema标准语法)

    来源:http://bbs.w3china.org/dispbbs.asp?BoardID=23&ID=27215&ReplyID=22178&skin=1 XML Schem ...

  7. 理解 XML Schema:XML Schema 初步 (I)

    理解 XML Schema:XML Schema 初步 (I) 内容: 购买订单模式文档 复合类型定义,元素和属性声明 出现约束 全局元素和属性 命名冲突 简单类型 列表类型(List Type) 联 ...

  8. 理解XML Schema: XML Schema 初步 (I)(转)

    本文章系列是XML Schema的一个从入门到进阶的基本教程.内容主要翻译整理了W3C关于XML Schema的入门级规范:XML Schema Part 0: Primer( http://www. ...

  9. 如何用DOM4J编程使用xml schema

    以下代码为DOM4J中使用XML SCHEMA方式校验XML的部分程序代码,红字部分为schema的描述文件.另外,切记需要将xerces.jar加在java路径中,否则就会抛 org.xml.sax ...

最新文章

  1. Natural 自然语言处理(NLP)「全解析」
  2. Linux安装程序Anaconda分析
  3. c++学习02——queue
  4. CF1526 D. Kill Anton
  5. python nodemcu_python开发nodemcu(一)
  6. Liferay SSO CAS 集成
  7. 来啦~ C++学习建议和学习资料
  8. [转载].NET开发常用的10条实用代码
  9. PyCharm使用opencv错误解决办法:ModuleNotFoundError: No module named 'cv2'/ImportError: DLL load failed
  10. 全三轨磁条卡读写器|写卡器MSR606的驱动安装与Demo软件测试操作指南
  11. oracle中group by rollup函数的的用法
  12. 英语语法---代词详解
  13. 用freemarker生成word文档,并插入图片
  14. JAVA中RandomAccess接口
  15. 力扣 1818. 绝对差值和 数学 二分
  16. poi导出excel包含图片,弹出页面下载框
  17. SVN_Windows安装Subversion(svn 命令行工具)教程
  18. Eclipse运行速度优化
  19. 使用genymotion模拟器下载软件出现unfortunately browser has stopped错误
  20. MACD策略引入backtrader出错

热门文章

  1. oracle数据库如何授权收费吗,Oracle数据库如何授权收费
  2. ubuntu/centos下安装bcompare
  3. 同步异步,阻塞非阻塞
  4. js复制链接到剪贴板
  5. 2021年B证(安全员)考试技巧及B证(安全员)复审考试
  6. parse_url用法和一些参数说明
  7. Sklearn数据预测
  8. 计算机防勒索病毒之系统主机加固篇
  9. Centos7右上角网络图标不见了
  10. v-for元素绑定事件代理