在xerces-c的官方站点上有文章指引说明是怎样进行xml schema校验。

http://xerces.apache.org/xerces-c/schema-3.html

给出的样例代码:

// Instantiate the DOM parser.
XercesDOMParser parser;
parser.setDoNamespaces(true);
parser.setDoSchema(true);
parser.parse(xmlFile);

但。样例代码根本不起不论什么作用。

在调用XercesDOMParser::parse之前,还有两件事情要做:

1.调用XercesDOMParser::setValidationScheme来设置校验计划

parser.setValidationScheme( XercesDOMParser::Val_Auto);

parser.setValidationScheme( XercesDOMParser::Val_Always);

2.要调用XercesDOMParser::setErrorHandler, 当中參数必须是ErrorHandler类或子类的对象。

看以下样例

address.xml:

<?xml version="1.0" encoding="utf-8"?

>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="address.xsd">
<Recipient>Mr. Walter C. Brown</Recipient>
<House>good</House>
<Street>Featherstone Street</Street>
<Town>LONDON</Town>
<PostCode>EC1Y 8SY</PostCode>
<Country>UK</Country>
</Address>

address.xsd:

<?xml version="1.0" encoding="utf-8"?

>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:element name="Recipient" type="xs:string" />
<xs:element name="House" type="xs:string" />
<xs:element name="Street" type="xs:string" />
<xs:element name="Town" type="xs:string" />
<xs:element name="County" type="xs:string" minOccurs="0" />
<xs:element name="PostCode" type="xs:unsignedInt" />
<xs:element name="Country" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="IN" />
<xs:enumeration value="DE" />
<xs:enumeration value="ES" />
<xs:enumeration value="UK" />
<xs:enumeration value="US" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

new_address.cpp:

#include <stdio.h>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/dom/DOMException.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMLSException.hpp>
#include <xercesc/sax2/DefaultHandler.hpp> using namespace XERCES_CPP_NAMESPACE; class SchemaErrorHandler : public DefaultHandler
{
public:
SchemaErrorHandler() {}
~SchemaErrorHandler() {} void warning(const SAXParseException& exc)
{
printf( "warn in line:%lu, col:%lu, %s\n",
exc.getLineNumber(), exc.getColumnNumber(),
XMLString::transcode( exc.getMessage()) );
} void error(const SAXParseException& exc)
{
printf( "error in line:%lu, col:%lu, %s\n",
exc.getLineNumber(), exc.getColumnNumber(),
XMLString::transcode( exc.getMessage()) );
} void fatalError(const SAXParseException& exc)
{
printf( "fatal in line:%lu, col:%lu, %s\n",
exc.getLineNumber(), exc.getColumnNumber(),
XMLString::transcode( exc.getMessage()) );
} void resetErrors()
{
printf( "nothing\n" );
}
}; int main(int argc, char* argv[] )
{
if ( argc < 2 )
{
printf( "must specify a file\n" );
return -1;
} XMLPlatformUtils::Initialize(); XercesDOMParser parser;
SchemaErrorHandler handler;
try
{
parser.setErrorHandler( &handler );
parser.setDoNamespaces(true);
parser.setDoSchema(true);
//parser.setValidationScheme( XercesDOMParser::Val_Auto);
parser.parse( argv[1] );
} catch ( SAXException& e )
{
printf( "msg:%s\n", XMLString::transcode(e.getMessage() ) );
return -2;
}
catch ( XMLException& e )
{
printf( "code:%d, msg:%s\n", e.getCode(), XMLString::transcode( e.getMessage() ) );
return -3;
}
catch ( DOMException& e )
{
printf( "code:%d, msg:%s\n", e.code, e.msg );
return -4;
} return 0;
}

能够看到这里的代码凝视掉了这一行:

//parser.setValidationScheme( XercesDOMParser::Val_Auto);

编译执行:

[xuzhina@localhost sample]$ g++ -g -o new_address new_address.cpp -lxerces-c
[xuzhina@localhost sample]$ ./new_address address.xml
[xuzhina@localhost sample]$

//parser.setValidationScheme( XercesDOMParser::Val_Auto);

打开,但凝视掉

parser.setErrorHandler( &handler );

编译执行:

[xuzhina@localhost sample]$ g++ -g -o new_address new_address.cpp -lxerces-c
[xuzhina@localhost sample]$ ./new_address address.xml
[xuzhina@localhost sample]$

parser.setErrorHandler( &handler );

打开,编译执行:

[xuzhina@localhost sample]$ ./new_address address.xml
error in line:8, col:31, value 'EC1Y 8SY' does not match regular expression facet '[+\-]?[0-9]+'

执行一下xmllint,对照一下结果:

[xuzhina@localhost sample]$ xmllint --schema address.xsd address.xml
<?xml version="1.0" encoding="utf-8"?>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="address.xsd">
<Recipient>Mr. Walter C. Brown</Recipient>
<House>good</House>
<Street>Featherstone Street</Street>
<Town>LONDON</Town>
<PostCode>EC1Y 8SY</PostCode>
<Country>UK</Country>
</Address>
address.xml:8: element PostCode: Schemas validity error : Element 'PostCode': 'EC1Y 8SY' is not a valid value of the atomic type 'xs:unsignedInt'.
address.xml fails to validate

PS:

在xml schema中,string是兼容其他类型,比方在House标签的内容写上数字,比方49,不管xmllint, 还是xerces都不会报这个标签的值有问题。

以前为这个问题折腾一个下午。

用xerces-c来进行xml schema校验的更多相关文章

  1. W3C XML Schema 教程

    转自:http://www.blogjava.net/sham2k/articles/179825.html W3C XML Schema 教程 XML SCHEMA教程 本教程是笔者学习W3C的&l ...

  2. XML Schema and XMLspy notes

    Introduction An xml documents consists of elements, attributes and text. There are two structures in ...

  3. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  4. XML Schema命名空间解析

    URI Web中汇集了各种资源.资源可以是具有标识的任何事物, 如文档. 文件. 菜单项. 计算机. 服务等, 甚至可以包括人. 组织和概念[BernersLee 1998].在Web体系结构中, ...

  5. 【转】XSD (xml Schema Definition)

    来自:http://www.cnblogs.com/newsouls/archive/2011/10/28/2227765.html Xml Schema的用途 1.  定义一个Xml文档中都有什么元 ...

  6. C#与XML Schema的问题

    http://bbs.csdn.net/topics/50493564 weileily: 用XmlSchema.Read方法读取了一个xsd文件,请问如何遍历检索器中的ComplexType与Sim ...

  7. XML Schema的基本语法(转)

    XML Schema的基本语法(转) XSDL(XML Schema定义语言)由元素.属性.命名空间和XML文档种的其他节点构成的. 一.XSD中的元素 XSD文档至少要包含:schema根元素和XM ...

  8. Xml Schema:C#访问在complextype中插入新元素

    最近用c#写Xml Schema代码,找了很久也找不到如何在已有的complextype中插入新的element,最后我充分发挥自己的聪明才智,哈哈,终于从...中找到了灵感. XmlSchemaSe ...

  9. [BTS] System.Xml.Schema.XmlSchemaException: The complexType has already been declared when generate IDoc schema.

    I use wcf-sap adapter for generate the schema of IDoc that named "YHREMPMASTER". but throw ...

随机推荐

  1. Windows Azure 网站上的 WebSocket 简介

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站最近新增了对 WebSocket 协议的支持..NE ...

  2. [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET

    Women Techmaker 北京站 [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET     [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素    发表于2 ...

  3. 【Cocos2d-X开发学习笔记】第03期:渲染框架之导演类(CCDirector)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 提到“导演”一词,想必读者最先联想到的是电影.作为娱乐产 ...

  4. “易信”今日正式更新至V1.1版

    热门移动通讯社交应用“易信”今日正式更新至V1.1版,目前用户已可在苹果AppStore和各大Android商店下载.新版本主要包括三大变化:开通公众平台.提供外部分享.强化社交安全,此外包含好友关系 ...

  5. ZOJ3640-Help Me Escape

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...

  6. css 基础(一)

    一.css样式表的分类 首先介绍一下css中的样式表  a.外部样式表  将需要的样式放在单独的外部文件中,需要使用是直接调用,通常放在.css文件中.例如:/*以下部分是放在(my.css)自定义名 ...

  7. Codeforces Round #315 (Div. 2A) 569A Music (模拟)

    题目:Click here 题意:(据说这个题的题意坑了不少人啊~~~)题目一共给了3个数---- T 表示歌曲的长度(s).S 表示下载了歌曲的S后开始第一次播放(也就是说S秒的歌曲是事先下载好的) ...

  8. 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

    函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...

  9. java读文件的几个类

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100f628.html 最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Wri ...

  10. USACO Healthy Holsteins DFS

    使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合 数据规模不大,暴力过去最多也就是2^15 = 23768种情况 所以就暴力咯,不过还是Debug了一会 Sou ...