采用Xerces C++执行基于schema的XML文档校验
2007-04-29 19:31
941 查看
[align=center]采用Xerces C++执行基于schema的XML文档校验[/align]
作者: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
[align=left]#include<stdio.h>[/align]
[align=left]#include<xercesc/sax2/XMLReaderFactory.hpp>[/align]
[align=left] [/align]
[align=left]XERCES_CPP_NAMESPACE_USE[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]int main( intargc , char** argv )[/align]
[align=left]{[/align]
[align=left] XMLPlatformUtils::Initialize(); //系统初始化[/align]
[align=left] [/align]
[align=left] //创建一个XML阅读器[/align]
[align=left] SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();[/align]
[align=left] [/align]
[align=left] //设置阅读器选项[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesValidationErrorAsFatal, true);[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreValidation, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesSchema, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);[/align]
[align=left] [/align]
[align=left] //加载XSD文件[/align]
[align=left] Grammar *gra= parser->loadGrammar ("gobitan.xsd", Grammar::SchemaGrammarType, true);[/align]
[align=left] parser->setFeature (XMLUni::fgXercesUseCachedGrammarInParse, true);[/align]
[align=left] [/align]
[align=left] //加载XML文件并执行schema校验[/align]
[align=left] parser->parse("gobitan.xml");[/align]
[align=left] [/align]
[align=left] //判断校验是否成功[/align]
[align=left] if (0 == parser->getErrorCount())[/align]
[align=left] {[/align]
[align=left] printf("validation succeed!/n");[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] printf("validation failed! /n");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //系统清理[/align]
[align=left] XMLPlatformUtils::Terminate();[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left] 注意xsd和xml文件均放在工程文件目录下即可。 [/align]
[align=left] 上面的代码很简单一看就明了,就不多解释了。写出来的目的是跟大家分享,节约大家的时间,因为真正你需要的时候自己去解决也肯定能弄出来,但那要花很多时间。上面的代码就是我摸索出来的,花了我大半天的时间,网上很难找到对口的例子。[/align]
你可以修改xml文档来判断校验是否真的有效。上面程序在需要Xerces C++的头文件和lib库,在VC6.0下编译通过并执行成功。
作者: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
[align=left]#include<stdio.h>[/align]
[align=left]#include<xercesc/sax2/XMLReaderFactory.hpp>[/align]
[align=left] [/align]
[align=left]XERCES_CPP_NAMESPACE_USE[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]int main( intargc , char** argv )[/align]
[align=left]{[/align]
[align=left] XMLPlatformUtils::Initialize(); //系统初始化[/align]
[align=left] [/align]
[align=left] //创建一个XML阅读器[/align]
[align=left] SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();[/align]
[align=left] [/align]
[align=left] //设置阅读器选项[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesValidationErrorAsFatal, true);[/align]
[align=left] parser->setFeature(XMLUni::fgSAX2CoreValidation, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesSchema, true);[/align]
[align=left] parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);[/align]
[align=left] [/align]
[align=left] //加载XSD文件[/align]
[align=left] Grammar *gra= parser->loadGrammar ("gobitan.xsd", Grammar::SchemaGrammarType, true);[/align]
[align=left] parser->setFeature (XMLUni::fgXercesUseCachedGrammarInParse, true);[/align]
[align=left] [/align]
[align=left] //加载XML文件并执行schema校验[/align]
[align=left] parser->parse("gobitan.xml");[/align]
[align=left] [/align]
[align=left] //判断校验是否成功[/align]
[align=left] if (0 == parser->getErrorCount())[/align]
[align=left] {[/align]
[align=left] printf("validation succeed!/n");[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] printf("validation failed! /n");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //系统清理[/align]
[align=left] XMLPlatformUtils::Terminate();[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left] 注意xsd和xml文件均放在工程文件目录下即可。 [/align]
[align=left] 上面的代码很简单一看就明了,就不多解释了。写出来的目的是跟大家分享,节约大家的时间,因为真正你需要的时候自己去解决也肯定能弄出来,但那要花很多时间。上面的代码就是我摸索出来的,花了我大半天的时间,网上很难找到对口的例子。[/align]
你可以修改xml文档来判断校验是否真的有效。上面程序在需要Xerces C++的头文件和lib库,在VC6.0下编译通过并执行成功。
相关文章推荐
- 关于Xerces-C++执行schema校验相关问题的详细解答
- 关于Xerces-C++执行schema校验相关问题的详细解答
- 关于Xerces-C++执行schema校验相关问题的详细解答
- 浅谈利用Xerces C++解析XML文档
- C++中Xerces解析xml文档
- xml基于Schema的XML文档有效性验证
- 如何利用Xerces C++解析包含中文字符的XML文档
- c++中使用xercesc对xml进行schema校验
- 对XML文档进行Schema校验的方法(适用于Framework2.0及以上版本)
- 利用Xerces C++解析XML文档
- 使用DOM4J解析XML及采用Schema校验的方法
- 如何利用Xerces C++正确处理XML文档中的WhiteSpace
- Xerces-C++ SAX2 Schema校验
- Xerces-C++更新XML文档的空行格式问题
- Xerces C++正确处理XML文档
- Xerces C++ SAX解析XML文档
- 如何利用Xerces C++解析包含中文字符的XML文档
- Xerces-C++更新XML文档的空行格式问题
- 利用Xerces C++正确处理XML文档中的中文
- 基于xerces-c2.8的xml分析