当前位置:首页 > Windows程序 > 正文

windows下使用xerces

2021-03-25 Windows程序

标签:

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++)语言编写的)。

引用 :

下载和安装

下载地址 :

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”;

参考:

项目示例 功能要求

读取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;

}

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66982.html