码迷,mamicode.com
首页 > Windows程序 > 详细

windows下使用xerces -c解析XML

时间:2015-09-28 20:41:24      阅读:882      评论:0      收藏:0      [点我收藏+]

标签:

windows下使用Xerces-C++解析XML

 

Xerces-C++: 简史

Xerces-C++ 的前身是 IBM 的 XML4C 项目。XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将其分别改名为 Xerces-C++ 和 Xerces-J。 这两个项目是 Apache XML 组的核心项目(如果看到的是“Xerces-C”而不是“Xerces-C++”,也是同一个东西,因为这个项目一开始就是用 C(译者注:原文为C++)语言编写的)。

引用 :http://www.ibm.com/developerworks/cn/xml/x-xercc/

 

下载和安装

下载地址 : http://xerces.apache.org/xerces-c/download.cgi

 

Win32 版本上的编译

 

主要步骤:

1.VS 2015打开xerces-c-3.1.2\projects\Win32\VC12\xerces-all\xerces-all.sln,选中XercesLib->右击->编译;

2.复制xerces-c-3.1.2\Build\Win32\VC12\Debug文件夹下的xerces-c_3_1D.dll,xerces-c_3D.lib文件到目标工程下;复制xerces-c-3.1.2下的src文件夹到目标工程下(可以不复制过来,但必须指定对应的路径);

 

调用动态库的配置

3.右击项目名,属性,配置“C++附加包含目录” 增加\src;配置“linker附加依赖项” 增加“xerces-c_3D.lib”;

参考:http://www.bubuko.com/infodetail-929555.html

 

项目示例

功能要求

读取aaa.xml文件,遍历每一个节点,若存在子节点则输出当前结点名称,若不存在子节点则输出当前结点名称和内容(输入与输出见下图)。

 

 

包含头文件

#include <xercesc/util/PlatformUtils.hpp>

#include <xercesc/dom/DOM.hpp>

#include <xercesc/sax/HandlerBase.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>

XERCES_CPP_NAMESPACE_USE 

函数介绍

初始化环境

    XMLPlatformUtils::Initialize();

 

加载分析报文  

XercesDOMParser *parser = new XercesDOMParser();

 

设置校验计划 

parser->setDoNamespaces(true);    // optional

parser->setValidationScheme(XercesDOMParser::Val_Always);

ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();

parser->setErrorHandler(errHandler);

 

载入XML文件

parser->parse("aaa.XML");

 

得到文档的树型结构

DOMDocument *doc = parser->getDocument();

DOMElement *root = doc->getDocumentElement();//读取根节点   

 

获取子元素

    DOMElement* child = root->getFirstElementChild();

 

获取元素名称和内容

    char* name = XMLString::transcode(root->getTagName());

    char* textContent = XMLString::transcode(root->getTextContent());

 

获取下一个同级元素

    root = root->getNextElementSibling();

 

 

aaa.xml文件

//----------------------------------

<?xml version="1.0" encoding="UTF-8"?>

<MSG>

 <META>

   <SNDR>FIMS</SNDR>

   <RCVR/>

   <SEQN>29</SEQN>

   <DDTM>20150121194100</DDTM>

   <TYPE>DFME</TYPE>

   <STYP>AIRL</STYP>

 </META>

 <DFLT>

 <FLID>30798</FLID>

 <FFID>3U-8899-20150925-D</FFID>

 <FLTK>W/Z</FLTK>

    <AIRL>

      <ARPT>

         <APNO>1</APNO>

         <APCD>CGO</APCD>

         <FPTT>20150925194100</FPTT>

         <FETT>20150926062203</FETT>

         <FRTT/><FPLT/>

         <FELT/><FRLT/>

         <APAT>2403</APAT>

      </ARPT>

      <ARPT>

        <APNO>2</APNO>

        <APCD>SJW</APCD>

        <FPTT/><FETT/><FRTT/>

        <FPLT>20150925224100</FPLT>

        <FELT/><FRLT/>

        <APAT>2403</APAT>

       </ARPT>

     </AIRL>

  </DFLT>

</MSG>

//----------------------------------

编码实现

//----------------------------------

 

// xmltest.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <stdlib.h>

#include <iostream>

 

#include <xercesc/util/PlatformUtils.hpp>

#include <xercesc/dom/DOM.hpp>

#include <xercesc/sax/HandlerBase.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>

XERCES_CPP_NAMESPACE_USE

 

using namespace std;

void GetData(DOMElement *root) ;//自定义函数

 

/*const int MAXN = 2000;

char  XMLbuf[MAXN] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MSG><META><SNDR>SYSTEM</SNDR><TYPE>ERROR</TYPE><STYP/><DDTM>2015-09-25 14:15:25</DDTM><SEQN/></META><CONTENT><CODE>15</CODE><DESC>error,it is not on the IMF now,please retry login</DESC></CONTENT></MSG>";*/

 

int main()

{

    /*//将字符串写入文件

    FILE * fd = fopen("aaa.XML", "w");

    fprintf(fd, XMLbuf);

    fclose(fd);*/

 

    //初始化环境

    try{

        XMLPlatformUtils::Initialize();

    }

    catch (const XMLException& toCatch) {

        // Do your failure processing here                       

        return -1;

    }

    //加载分析报文                                                        

    XercesDOMParser *parser = new XercesDOMParser();

    parser->setDoNamespaces(true);    // optional  

   

    parser->setValidationScheme(XercesDOMParser::Val_Always);//设置校验计划    

    ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();

parser->setErrorHandler(errHandler);

 

    //载入XML文件

    try {

        parser->parse("aaa.XML");

    }

    catch (const XMLException& toCatch) {

        char* message = XMLString::transcode(toCatch.getMessage());

        cout << "Exception message is: \n"

            << message << "\n";

        XMLString::release(&message);

        return -2;

    }

    catch (const DOMException& toCatch) {

        char* message = XMLString::transcode(toCatch.msg);

        cout << "Exception message is: \n"

            << message << "\n";

        XMLString::release(&message);

        return -3;

    }

    catch (...) {

        cout << "Unexpected Exception \n";

        return -4;

    }

 

    //得到文档的树型结构

    DOMDocument *doc = parser->getDocument();

    DOMElement *root = doc->getDocumentElement();//读取根节点   

 

    //遍历所有数据

    GetData(root);

 

    XMLPlatformUtils::Terminate();//释放环境   

    getchar();

    return 0;

}

 

//获取DOM元素数据

void GetData(DOMElement *root) {

    while (root != NULL) {

        //获取子元素

        DOMElement* child = root->getFirstElementChild();

        //如果有子元素

        if (child != NULL)

        //if ((root->hasChildNodes())==true)//使用hasChildNodes()判断是否有子节点会出问题,原因不详.2015-09-28htf

        {

            //打印当前元素名称

            char* name = XMLString::transcode(root->getNodeName());//child->getParentNode()->getNodeName()

            printf("getTagName:%s\n", name);

            XMLString::release(&name);

 

            //获取DOM子元素数据

            DOMElement* child = root->getFirstElementChild();

            GetData(child);

        }

        //如果当前元素没有子元素

        else {

            //打印元素名称和值。

            char* name = XMLString::transcode(root->getTagName());//child->getNodeName()

            char* textContent = XMLString::transcode(root->getTextContent());

            printf("%s:%s\n", name, textContent);

            XMLString::release(&name);

            XMLString::release(&textContent);

        }

        //指向下一个同级元素

        root = root->getNextElementSibling();

    }

}

//-----------------------------------

 

遇到的问题

。。。

参考文档

官方文档:

http://xerces.apache.org/xerces-c/ApacheDOMC++Binding.html

 

Xerces C++ 学习笔记:

http://www.cppblog.com/true/archive/2007/03/15/19900.html?opt=admin

 

如何在VS2010中使用xerces C++:

http://xzhoumin.blog.163.com/blog/static/40881136201342251923494

 

 

简单实用的Xml解析类:

http://www.vckbase.com/index.php/wv/1459

 

 

c++ 使用xerces读取XML:

http://www.bubuko.com/infodetail-929555.html

 

DOM Xerces类库使用方法:

http://panpan.blog.51cto.com/489034/187272

 

总结

读取XML有两种模式,一种是基于事件的SAX方式,一种是DOM,本文采用DOM方式。

 

 

——2015.09.28

 

windows下使用xerces -c解析XML

标签:

原文地址:http://www.cnblogs.com/anwcq/p/xerces-c.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!