您的位置:首页 > 编程语言 > C语言/C++

采用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下编译通过并执行成功。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息