采用Xerces C++执行基于schema的XML文档校验
作者:gobitan(雨水) 日期: 2007-04-29 转载请注明出处http://blog.csdn.net/gobitan
Xerces C++是Apache软件基金会下的一个XML解析器项目,该项目也有Java版的。它是目前功能最为强大的XML解析器,广泛应用于各类项目。
本文介绍了如何利用Xerces C++对XML文档执行schema校验。由于本文只是重点强调该功能的使用,为了简单明了将实例中的代码进行了精简,去掉了很多异常考虑等其他特性。
要对一个XML文档执行schema校验,那么首先得准备好一份XML文档和该文档对应的含有schema定义的xsd文档。
gobitan.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<phonebook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="gobitan.xsd">
<name>
<first>Tom</first>
<last>Jones</last>
</name>
<phone type="home">420-203-2032</phone>
</phonebook>
gobitan.xsd文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="phonebook">
<xs:complexType>
<xs:sequence>
<xs:element name="name" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="phone" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="type" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
代码文件validate.cpp
#include
<stdio.h>
#include
<xercesc
/sax2/
XMLReaderFactory
.hpp>
XERCES_CPP_NAMESPACE_USE
in
t
main(
in
t
argc
,
char
**
argv
)
{
XMLPlatformUtils
::
In
itialize
();
//
系统初始化
//
创建一个
XML
阅读器
SAX2XMLReader
*
parser
=
XMLReaderFactory
::
createXMLReader
();
//
设置阅读器选项
parser
->
setFeature
(
XMLUni
::
fgSAX2CoreNameSpaces
,
true
);
parser
->
setFeature
(
XMLUni
::
fgSAX2CoreNameSpacePrefixes
,
true
);
parser
->
setFeature
(
XMLUni
::
fgXercesValidationErrorAsFatal
,
true
);
parser
->
setFeature
(
XMLUni
::
fgSAX2CoreValidation
,
true
);
parser
->
setFeature
(
XMLUni
::
fgXercesSchema
,
true
);
parser
->
setFeature
(
XMLUni
::
fgXercesSchemaFullChecking
,
true
);
//
加载
XSD
文件
Grammar
*
gra
=
parser
->
loadGrammar
(
"gobitan.xsd"
,
Grammar
::SchemaGrammarType,
true
);
parser
->
setFeature
(
XMLUni
::
fgXercesUseCachedGrammarInParse
,
true
);
//
加载
XML
文件并执行
schema
校验
parser
->
parse
(
"gobitan.xml"
);
//
判断校验是否成功
if
(0 ==
parser
->
getErrorCount
())
{
printf
(
"validation succeed!/n"
);
}
else
{
printf
(
"validation failed! /n"
);
}
//
系统清理
XMLPlatformUtils
::
Terminate
();
return
0;
}
注意xsd和xml文件均放在工程文件目录下即可。
上面的代码很简单一看就明了,就不多解释了。写出来的目的是跟大家分享,节约大家的时间,因为真正你需要的时候自己去解决也肯定能弄出来,但那要花很多时间。上面的代码就是我摸索出来的,花了我大半天的时间,网上很难找到对口的例子。
你可以修改xml文档来判断校验是否真的有效。上面程序在需要Xerces C++的头文件和lib库,在VC6.0下编译通过并执行成功。