设为首页 收藏本站
查看: 692|回复: 0

[经验分享] 使用Apache xercesc验证XML文件的Schema

[复制链接]

尚未签到

发表于 2017-1-12 08:17:49 | 显示全部楼层 |阅读模式
  #include <iostream>#include <list>#include <string>#include <xercesc/util/OutOfMemoryException.hpp>#include <xercesc/dom/DOM.hpp>#include <xercesc/parsers/XercesDOMParser.hpp>#include <xercesc/framework/XMLGrammarDescription.hpp>#include <xercesc/sax/ErrorHandler.hpp>#include <xercesc/sax/SAXParseException.hpp>using std::cerr;using std::endl;XERCES_CPP_NAMESPACE_USEclass StrX{char* fLocalForm;public :StrX(const XMLCh* const toTranscode) { fLocalForm = XMLString::transcode(toTranscode); }~StrX() { XMLString::release(&fLocalForm); }const char* localForm() const { return fLocalForm; }};std::ostream&operator<<(std::ostream& target, const StrX& toDump){target << toDump.localForm();return target;}class DOMTreeErrorReporter : public ErrorHandler{public:void warning(const SAXParseException& toCatch) {}void resetErrors() {}void DOMTreeErrorReporter::error(const SAXParseException& toCatch) {cerr << "Error at file /"" << StrX(toCatch.getSystemId())<< "/", line " << toCatch.getLineNumber()<< ", column " << toCatch.getColumnNumber() << endl<< " Message: " << StrX(toCatch.getMessage()) << endl;}void DOMTreeErrorReporter::fatalError(const SAXParseException& toCatch) {cerr << "Fatal Error at file /"" << StrX(toCatch.getSystemId())<< "/", line " << toCatch.getLineNumber()<< ", column " << toCatch.getColumnNumber() << endl<< " Message: " << StrX(toCatch.getMessage()) << endl;}};// ---------------------------------------------------------------------------intmain(int argc, const char** argv){try{XMLPlatformUtils::Initialize();}catch(const XMLException& e){StrX tmp_e(e.getMessage());cerr << "Xerces initialization error: " << tmp_e.localForm() << endl;return 2;}if ( argc < 1 ){cerr << "usage: schema-check <xml-file> [<schema-file> ...]" << endl;return 3;}XercesDOMParser *parser = new XercesDOMParser;DOMTreeErrorReporter *errReporter = new DOMTreeErrorReporter();parser->setErrorHandler(errReporter);parser->setDoNamespaces(true);parser->setCreateEntityReferenceNodes(true);parser->useCachedGrammarInParse(true);if ( argc > 2 ){parser->setDoSchema(true);parser->setDoValidation(true);parser->setValidationSchemaFullChecking(true);for ( int i = 2; i < argc; i++ ){if ( parser->loadGrammar(argv, Grammar::SchemaGrammarType, true) == 0 ){cerr << "Error loading grammar " << std::string(argv) << endl;return 4;}}}bool errorsOccured = true;try{parser->parse(argv[1]);errorsOccured = false;}catch ( const OutOfMemoryException& ){cerr << "Out of memory exception." << endl;}catch ( const XMLException& e ){cerr << "An error occurred during parsing" << endl<< " Message: " << StrX(e.getMessage()) << endl;}catch ( const DOMException& e ){const unsigned int maxChars = 2047;XMLCh errText[maxChars + 1];cerr << endl<< "DOM Error during parsing: '" << std::string(argv[1]) << "'" << endl<< "DOM Exception code is: " << e.code << endl;if ( DOMImplementation::loadDOMExceptionMsg(e.code, errText, maxChars) )cerr << "Message is: " << StrX(errText) << endl;}catch (...){cerr << "An error occurred during parsing." << endl;}if (!errorsOccured){cerr<<"验证成功"<<endl;return 1;}else{cerr<<"验证失败"<<endl;return 0;}}
  -------------------------booklist.xsd----------------------------------------
  <?xml version="1.0" encoding="GB2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="booklist">
<xs:complexType>
<xs:sequence>
<xs:element name="book" type="bookType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="ISBN" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="authorlist" type="authorlistType"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="classify" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="社会科学"/>
<xs:enumeration value="自然科学"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:complexType name="authorlistType">
<xs:sequence maxOccurs="4">
<xs:element name="author" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
  -------------------------------booklist.xml--------------------------------
  <?xml version="1.0" encoding="GB2312"?>
<booklist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="booklist.xsd">
<book classify="自然科学">
<ISBN>7-302-12066-8</ISBN>
<title>JAVA使用教程</title>
<authorlist>
<author>Herbert Scihldt</author>
<author>马海军</author>
</authorlist>
<price>64.00</price>
</book>
<book classify="社会科学">
<ISBN>7-5037-1978</ISBN>
<title>投资学</title>
<authorlist>
<author>张中华</author>
<author>谢老三</author>
</authorlist>
<price>19.00</price>
</book>
</booklist>
使用如下命令行参数验证booklist.xml是否符合booklist.xsd
  booklist.xml booklist.xsd
  如果验证成功提示验证成功,否则出现异常

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327202-1-1.html 上篇帖子: apache与tomcat集成session丢失问题解决方案 下篇帖子: 采用apache commons email实现邮件的发送
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表