C++中解析xml文件用什么方法?
解析xml文件,开发IDE是Dev-C++
尝试用msxml4,但编译连接的时候总是出错
请教有没有其他方法或库?
[解决办法]
xerces库,开源的。
[解决办法]
支持xerces。
记着把它的例子一阵狂删,精简一下再看。
[解决办法]
libxml,或者libxml++
[解决办法]
Xerces C++解析XML文档
前一阵子学习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++)语言编写的)。
Xerces-C++: 功能介绍
Xerces-C++是一个非常健壮的 XML 解析器,其提供的两种解析XML文档的方法,DOM和SAX (我是采用DOM方法)。
SAX是一个面向事件的编程API.一个解析引擎消耗XML序列数据,并在发现进来的XML数据的结构时回调应用程序,这些回调称为事件句柄.
与SAX不同,它允许对XML文档进行编辑并保存为一个文件或者流,还允许以编程的方式构建一个XML文档.DOM提供了一个内存中的模型,你可以遍历文档树,删除节点或者嫁接新节点.与解析的SAX事件不同,DOM事件反映出用户与文档的互动以及使用文档的改变.
总的来说,SAX是按行遍历XML文档的,而DOM是先把XML文档生成树,然后遍历DOM树,来解析每个节点.
Xerces-C++:学习的过程
1、平台选择:
在学习Xerces-C++之前你必须选择一种应用平台,可以是windows、linux、cygwin,以及solaris等系统平台。在这里,我选用的是Redhat Enterprise Linux AS3,选用的Xerces-C++ 是xerces-c-src_2_7_0.tar.gz,可以从官方网站:http://www.apache.org/ 直接下载。
2、编译源码
由于我下载下来的是源码,所以需要对其进行编译,否则我们无法加载库文件。
首先进入你的工作目录:cd /home/olcom/laubo(这是我当前工作目录)
然后解压你的源码包: tar zxvf xerces-c-src_2_7_0.tar.gz
设置包含源代码的环境变量:
export XERCESCROOT=/home/olcom/laubo/xerces-c-src_2_7_0
进入目录:cd xerces-c-src_2_7_0/src/xercesc
运行脚本生成makefile文件:
./runConfigure -plinux -cgcc -xg++ -C--prefix=/opt/ApacheXML
选项: -p 为操作系统平台
-c C 编译器
-x C++编译器
-c 库的配置路径
编译源码:make
make install
(编译可能要花费你好一会儿,在我的机器上花费大约7分钟的时间,所以要耐心等候)
3、学习类库
因为类库很大,所以刚开始,我并没有选择去分析与阅读类库,我是先在网上了一个比较完整的例子,然后对其进行编译和调试,然后从例子下手去分析类库所提供的接口。这里,我把自己的程序简化了一下,希望可以作为大家学习的例子。
首先,我们需要定义一种 XML文档的样式。在这里,我们简单的定义一种样式(含有中文),如下:
//sample.xml
<?xml version= "1.0 " encoding= "utf-8 " standalone= "no "?>
<国家调查>
<Node1>
<subNode>
<subNode1>
<subNode11> china 111-> 江苏 </subNode11>
<subNode11> china 112-> 天津 </subNode11>
<subNode11> china 113-> 北京 </subNode11>
<subNode11> china 114-> 上海 </subNode11>
<subNode11> china 115-> 广州 </subNode11>
</subNode1>
</subNode>
<subNode1> Asia 12-> 韩国 </subNode1>
<subNode2> Asia 13-> 日本 </subNode2>
<subNode3> Asia 14-> 越南 </subNode3>
<subNode4> Asia 15-> 柬埔寨 </subNode4>
<subNode5> Asia 16-> 老挝 </subNode5>
</Node1>
<Node2>
<subNode> America 21-> 巴西 </subNode>
<subNode> America 22-> 阿根廷 </subNode>
<subNode> America 23-> 智利 </subNode>
<subNode> America 24-> 墨西哥 </subNode>
<subNode> America 25-> 巴拉圭 </subNode>
<subNode> America 26-> 美国 </subNode>
<subNode> America 27-> 加拿大 </subNode>
</Node2>
<Node3>
<subNode> Europe 31-> 英国 </subNode>
<subNode> Europe 32-> 意大利 </subNode>
<subNode> Europe 33-> 法国 </subNode>
<subNode> Europe 34-> 德国 </subNode>
<subNode> Europe 35-> 西班牙 </subNode>
<subNode> Europe 36-> 匈牙利 </subNode>
</Node3>
<Node5> THE END </Node5>
</国家调查>
定义好格式后,我们来看看程序是如何实现对其解析的,程序如下:
CODE:
[Copy to clipboard]
//CXML.h
#ifndef XML_PARSER_HPP
#define XML_PARSER_HPP
#include <xercesc/util/TransService.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMDocumentType.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMNodeIterator.hpp>
#include <xercesc/dom/DOMNodeList.hpp>
#include <xercesc/dom/DOMText.hpp>
#include <xercesc/dom/DOMAttr.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLUni.hpp>
#include <xercesc/framework/XMLFormatter.hpp>
#include <xercesc/util/XMLString.hpp>
#include <stdlib.h>
#include <string>
#include <vector>
#include <stdexcept>
using namespace std;
using namespace xercesc;
class XMLStringTranslate;
class CXML
{
public:
CXML();
~CXML();
XMLTransService::Codes tranServiceCode;
void xmlParser(string&) throw(std::runtime_error);
private:
XMLStringTranslate *XMLTan;
xercesc::XercesDOMParser *m_DOMXmlParser; //定义解析对象
};
class XMLStringTranslate : public XMLFormatTarget
{
public:
XMLStringTranslate(const char * const encoding);
bool TranslatorUTF8ToChinese(string &strTranslatorMsg);
bool UTF8_2_GB2312(char *in, int inLen, char *out, int outLen);
string translate(const XMLCh* const value);
const XMLCh * const translate(const char * const value);
virtual ~XMLStringTranslate();
protected:
XMLFormatter * fFormatter;
XMLCh * fEncodingUsed;
XMLCh * toFill;
char * m_value;
protected:
enum Constants
{
kTmpBufSize = 16 * 1024,
kCharBufSize = 16 * 1024
};
void clearbuffer();
virtual void writeChars(const XMLByte* const toWrite
, const unsigned int count
, XMLFormatter* const formatter);
};
#endif
[解决办法]
xml4c
------http://www.alphaworks.ibm.com/tech/xml4c
IBM的XML Parser,用c++语言写就,功能超级强大。号称支持多达100种字符编码,能够支持中文,
适合于大规模的xml应用。若只是很小范围的应用,则非最佳选择,毕竟,你需要“背负”约12M左右的
dll的沉重负担
Xerces c++
-------http://xml.apache.org/xerces-c
Apache的XML项目,同样是c++ 实现,来源于IBM的xml4c,因此编程接口也是和xml4c一致的。但是
目前只支持少数的字符编码,如ASCII,UTF-8,UTF-16等,不能处理包含中文字符的XML文档。
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定
义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema
的基本完整的开放标准。
XMLBooster
-------http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序
来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
PS: 我用的是 Xerces
[解决办法]
xerces库
我一直都用它
由于它开源,并且维护的文档比较不错,容易上手.
[解决办法]
Xerces太臃肿了
expat轻量级SAX类型XML解析接口
[解决办法]
c/c++语言的一些lib支持,windows上MSXML
开源:Apache.org找,n多,但是我只用过一个。
或者QT