社区
C++ 语言
帖子详情
推荐一个C++解析XML的库吧?
greatcat
2006-07-16 01:19:09
需求:
功能要求不多,只要最简单的XML检查和解析,但是要求跨平台非常好,支持HP UNIX,AIX,SUN,LINUX,WINDOWS
最好能做过比较啊,谢谢了
ACE提供的好用么?
...全文
5316
13
打赏
收藏
推荐一个C++解析XML的库吧?
需求: 功能要求不多,只要最简单的XML检查和解析,但是要求跨平台非常好,支持HP UNIX,AIX,SUN,LINUX,WINDOWS 最好能做过比较啊,谢谢了 ACE提供的好用么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AnDay_Fly
2010-06-24
打赏
举报
回复
Xerces
ztenv
版主
2010-06-24
打赏
举报
回复
Xerces-c和TinyXml都很不错,并且都可以跨平台;
不过在vs200x下面使用Xerces-c时,很有可能与msxml冲突,个人遇到过,费了老半天时间才解决;
macrojj
2010-06-24
打赏
举报
回复
TinyXML吧
vanezuo
2010-06-24
打赏
举报
回复
TinyXml
很不错啊
zhongyj2004
2006-07-17
打赏
举报
回复
我们在windows solaris aix上用过xercesc,都能运行,其他的平台应该也没问题
FigoZhu
2006-07-17
打赏
举报
回复
TinnyXML
hu_vane
2006-07-17
打赏
举报
回复
ACE提供的还不错。
tianjieshui
2006-07-17
打赏
举报
回复
xml4c++ 很好用的说
Dong
2006-07-16
打赏
举报
回复
Xerces,上面说的太多了。
pottichu
2006-07-16
打赏
举报
回复
推荐 Xerces
Xerces c++ --Apache的XML项目, 但 只支持少数的字符编码,如ASCII,UTF-8,UTF-16等,
不能处理包含中文字符的XML文档
但中文问题也是可以解决的。
1. 背景介绍
apache的xerces c++是广大c/c++程序员非常喜欢使用的xml解析器之一。主要原因是其本身是一个开放源代码的项目而且提供不同平台下的库和源代码,故深受广大c/c++程序员的欢迎。
xerces c++可以到以下网站下载:
1) http://xml.apache.org/
2) http://www.vckbase.com/tools
2. 问题描述
根据软件开发的要求,作者开发了一个文件特征识别软件,该软件可根据文件特有的特征识别出文件的类型。要求将文件特征保存在xml文件中。根据要求作者选择了xerces c++作为xml解析器。但发现出了一个严重的问题:被解析的xml文件中不能包含中文,否则中文将不能正确的解析。作者研究了xerces c++提供的例子程序,发现这些例子程序解析的结果也是错误的。只有domprint程序例外。这肯定了xerces c++本身是支持中文的。
xml编码:
<pdf ext="pdf" description="pdf文档"> <magic offset="0" type="string" value="\x25\x50\x44\x46" /> </pdf>saxprint程序解析结果:
<pdf ext="pdf" description="pdf文档"> <magic offset="0" type="string" value="\x25\x50\x44\x46"></magic></pdf>为此,作者曾经在ibm的中文网站发现一篇文章《如何利用xerces-c++解析包含中文字符的xml文档》并将其所描述的办法应用到程序中。但后来由于机器发生故障,硬盘上的数据全部丢失。不得不把以前做过的事重做一遍。因一时在ibm的网站上未找到上面提到的贴子,而且由于当时捡现成的没有用心研究其实现方法,故不得不仔细分析xerces c++提供的源代码,自己动手解决中文问题。为了今后广大c++程序员碰到类似问题时不会像我一样痛苦。我也决定将自己的研究结果公布出来供大家分享。如果谁有更好的解决办法不要忘记告诉我。
3. 原因分析
上面的例子里,程序将“文档”两个中文字符解析成了乱码。但domprint程序确能够正确解析。这表明xerces c++对国际编码肯定是支持的。作者通过对domprint和saxprint两个程序的比较跟踪发现问题的根本就是xmlformatter设置的问题。由于sax是基于事件的,大多数使用者只是简单的解析xml文档,xmlformatter的使用比较麻烦。而domprint也是通过标准的输出程序输出的屏幕上的,我们不能直接使用输出结果。
由于xml解析器解析的字符串都是xmlch格式的,一个字符占用一个字节,而汉字字符确要占用两个字节。故若不做适当的转换,汉字的输出结果就变成乱码了。
4. 解决办法
找到原因就有解决问题的方法了,明显的需要一个把解析出来的xmlch转换成普通的字符串。这是解析,如果我们需要自己写入xml文档也有一个把普通字符串转换为xmlch的过程。我把这两个转换过程封装在了一个名为“xmlstringtranslate”的类中。使用如下:
void saxmagichandlers::startelement(const xmlch* const name,attributelist& attributes){ xmlstringtranslate stringtranslate("gb2312"); string strname=stringtranslate.translate(name);//得到可包含汉字字符的普通字符串 string strvalue="pdf文档"; xmlch * value= stringtranslate.translate(strvalue.c_str());//将普通字符串转换成xmlch串}采用xmlstringtranslate后的实际运行结果:
<pdf ext="pdf" description="pdf文档"> <magic offset="0" type="string" value="\x25\x50\x44\x46"></magic></pdf>特别说明:
由于为了防止内存释放问题,将普通字符串转换成xmlch *的translate函数返回的是类的一个成员变量,故下面的代码是不允许的:
xmlch * value1= stringtranslate.translate("测试1");xmlch * value2= stringtranslate.translate("测试2");这样使用的结果是value1和value2的值将是一样的(因为其内存地址根本就是一样的)。正确的使用方法是通过内存拷贝或则其他方法,将value1的值保存起来或则及时使用,否则value2将影响value1的值。
jixingzhong
2006-07-16
打赏
举报
回复
除了 Xerces ,还可以考虑 MS 的 MSXML::
VC使用MSXML解析XML文档
现在XML文档应用的方面特别的多.
我把以前写过的一个例子帖出来,以备以后使用.
第一部分:DOM解析:
概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。
1、如何加载xml文件:
//创建DOM,加载XML文档
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(file.GetBuffer(0));
2、在XML文档中查找指定的结点:
//找到
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
if (pRootNode==NULL)
{
return ;
}
3、得到XML文档中,结点的属性
CString strTemp;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
pRootNode->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return;
}
MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
_bstr_t strRequestType=pRequestTypeAttr->Gettext();
strTemp=strRequestType.operator char *();
4、得到结点的内容
_bstr_t strVisiPort=pNode->Gettext();
5、设置结点的内容
HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));
6、设置一个属性内容
IXMLDOMAttribute *pa=NULL;
bstr = SysAllocString(L"属性1");
pXMLDom->createAttribute(bstr,&pNode);
var = VariantString(L"strin");
pa->put_value(var);
pRoot->setAttributeNode(pa, &pa1);
第二部分、如何使用SAX解析
概述:SAX使用的是加载式的,将会把XML文档分断,加载到内存中。使用事件通知的方式,来表示找到结点。好像没有写文档的能力吧。它的速度要比DOM快不少。
使用SAX的时候,就需要重载MSXML4.0中的一个接口ISAXContentHandler。
有几个函数重载了之后,当找到了结点之后,就会回调这一些函数。
chenhu_doc
2006-07-16
打赏
举报
回复
推荐用 Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。
chenhu_doc
2006-07-16
打赏
举报
回复
XML
Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。
XMLBooster
参考网站:http://www.xmlbooster.com/'>http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
Pull Parser
参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/'>http://www.extreme.indiana.edu/xgws/xsoap/xpp/
这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。
Xalan
参考网站:http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。
CMarkup
参考网站:http://www.firstobject.com/xml.htm'>http://www.firstobject.com/xml.htm
这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。
libxml++
http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++封装版本
VC使用Cmarkup生成、
解析
xml
资料
小:编译到你的工程只是很小的
一个
类,并且对于文档只维持了
一个
字符串,以及
一个
总计小于字符串内存大小的索引数组。 快:分析器在相当快的建立索引数组。 简单:EDOM方法使创建、导航和修改XML无比的简单。 ...
protobuf-2.5.0 jar包及代码生成工具
例如,如果有
一个
.proto文件,protoc可以生成Java、
C++
或Python的类,这些类能够方便地序列化和反序列化数据。 3. **
库
文件(protobuf-java-2.5.0.jar)**:这个jar包包含了protobuf在Java环境下的运行时
库
,用于在...
《实战Delphi6/Kylix2/SOAP/Web Service程序设计篇》(
在《实战Delphi6/Kylix2/SOAP/Web Service程序设计篇》这本书中,作者李维精心编撰了一套系统而全面的教程,针对的是Delphi6和Kylix2这两个经典的Visual Basic derivative (VBD) 编程环境,尤其是针对SOAP(Simple ...
C++
解析
XML
文件
C++
解析
XML
文件Tiny
XML
安装下载
解析
XML
文件 最近在使用
C++
处理GF-3和RADARSAT-2雷达影像,需要通过
解析
XML
文件获取影像时间,我选用了Tiny
XML
库
来
解析
。参考了网上的一些教程,这个文档个人觉得是解释的很清晰的。...
C++
解析
xml
示例
Xml
(Extensible Markup Language)即可扩展标记语言,
Xml
是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是
一个
拥有互联网最高级别通行证的数据携带者。
Xml
用于...
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章