用xerces-c来进行xml schema校验
在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校验的更多相关文章
- W3C XML Schema 教程
转自:http://www.blogjava.net/sham2k/articles/179825.html W3C XML Schema 教程 XML SCHEMA教程 本教程是笔者学习W3C的&l ...
- XML Schema and XMLspy notes
Introduction An xml documents consists of elements, attributes and text. There are two structures in ...
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...
- XML Schema命名空间解析
URI Web中汇集了各种资源.资源可以是具有标识的任何事物, 如文档. 文件. 菜单项. 计算机. 服务等, 甚至可以包括人. 组织和概念[BernersLee 1998].在Web体系结构中, ...
- 【转】XSD (xml Schema Definition)
来自:http://www.cnblogs.com/newsouls/archive/2011/10/28/2227765.html Xml Schema的用途 1. 定义一个Xml文档中都有什么元 ...
- C#与XML Schema的问题
http://bbs.csdn.net/topics/50493564 weileily: 用XmlSchema.Read方法读取了一个xsd文件,请问如何遍历检索器中的ComplexType与Sim ...
- XML Schema的基本语法(转)
XML Schema的基本语法(转) XSDL(XML Schema定义语言)由元素.属性.命名空间和XML文档种的其他节点构成的. 一.XSD中的元素 XSD文档至少要包含:schema根元素和XM ...
- Xml Schema:C#访问在complextype中插入新元素
最近用c#写Xml Schema代码,找了很久也找不到如何在已有的complextype中插入新的element,最后我充分发挥自己的聪明才智,哈哈,终于从...中找到了灵感. XmlSchemaSe ...
- [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 ...
随机推荐
- QT学习 之 事件与事件过滤器(分为五个层次)
事件 在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent.此类用来表示程序内部发生或者来自于外部但应用程序应该知道的动作.事件能够能过被 QObject 的子类接受或者处理,但是通常 ...
- boost::bind的使用方法
bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板.用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看不 ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- TCP/IP之TCP交互数据流、成块数据流
建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...
- BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定
题目:Click here 题意:给你n个点,有多少个正多边形(3,4,5,6). 分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可. #include ...
- BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )
dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...
- [转] Ant 编译 Android 项目为 Apk 实战, 常见问题解决
补充,自行安装Ant, 配置ant环境变量, 在android 项目 根目录下使用 android update project 可以自动生成 build.xml 和 local.peoperties ...
- javaScript 网页特效 输出语句
大家好,我是小强老师,今天主要讲解 三个最为常用的输出语句. alert() 弹出警示框 window.alert(‘继续学习’); 完整的写法 效果如下: 因为alert 属于window 对象 ...
- ICE之C/S通信原理
/* 在ICE文档中只需要声明module名称,接口名称,方法名称 */ #ifndef SIMPLE_ICE #define SIMPLE_ICE module Demo{ //module名称 i ...
- 华为s5700 添加与删除vlan
新建vlan 删除vlan ① 检查该VLAN下是否存在成员接口,使用如下命令:display vlan all② 如存在成员接口,则进入该接口视图,删除该成员,否则可略过此步骤,例如:interfa ...