`
yesjavame
  • 浏览: 688238 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

介绍一个可用于BREW的XML解析实现

阅读更多

高通在BREW平台中并没有为我们提供一个可以方便使用的API来实现XML文件的解析,在很多情况下,我们需要操作一个XML文件。就这事我曾电话咨询过博路的工程师,他给出的答复是可以购买一个商业组件来实现这个功能。事实上,没必要如此复杂,我们完全可以利用互联网上的免费的开源代码来实现这个功能。

本文要介绍的开源代码就是:Martyn C Brown为我们提供的一个完全基于ANSI C实现的MCBXml。
这是一个很纯的标准C实现,所以,要移植到BREW上是比较容易的。

第一步:我们直接把它揣进一个BREW工程中,编译一下,就会发现很多的编译错误出来了。(这一步的目的就是要看看它都有哪些东西不符合BREW的要求,这正是我们需要修改的地方)。

第二步:现在可以修改代码了,简单地利用#define将它使用的一些函数替换成BREW可以接受的形式。当然在这之前先移掉几个头引用,加入BREW的引用。对于头文件的修改就这么简单而已。而对于MCBXml.c的修改其它除了用#define来替换以外,还有一种方法就是“查找替换”法,呵呵,比如free换成FREE,malloc换成MALLOC之类的。

#include "AEEStdLib.h"
#define_T(name)(name)
#define_tcscpy(a,b)STRCPY(a,b)
#define_tcsstr(a,b)STRSTR(a,b)
#define_tcschr(a,b)STRCHR(a,b)
#define_tcslen(a)STRLEN(a)
#define_tcsnicmp(a,b,c)STRNICMP(a,b,c)

在MCBXml.c中,还有一个操作,我将函数McbGetError整个给注掉了(就是为了省事,如果你还要保留这个函数,额外做些工作就可以了)。

还有一个McbClearTags()函数的修改如下:

McbClearTag*McbGetClearTags()
...{
structMcbClearTag
*tags=(McbClearTag*)MALLOC(sizeof(McbClearTag)*6);

//structMcbClearTagtags[]=
//{
//{_T("<![CDATA["),_T("]]>")},
//{_T("<PRE>"),_T("</PRE>")},
//{_T("<Script>"),_T("</Script>")},
//{_T("<!--"),_T("-->")},
//{_T("<!DOCTYPE"),_T(">")},
//{NULL,NULL}
//};

MEMSET(tags,
0,sizeof(McbClearTag)*6);
tags[
0].lpszOpen=STRDUP("<![CDATA[");
tags[
0].lpszClose=STRDUP("]]>");
tags[
1].lpszOpen=STRDUP("<PRE>");
tags[
1].lpszClose=STRDUP("</PRE>");
tags[
2].lpszOpen=STRDUP("<!--");
tags[
2].lpszClose=STRDUP("-->");
tags[
3].lpszOpen=STRDUP("<!DOCTYPE");
tags[
3].lpszClose=STRDUP(">");
tags[
4].lpszOpen=STRDUP("<Script");
tags[
4].lpszClose=STRDUP("</Script>");
tags[
5].lpszOpen=NULL;
tags[
5].lpszClose=NULL;

returntags;

}
/**//*McbGetClearTags*/

在函数McbXMLElement * McbParseXML(LPCTSTR lpszXML, McbXMLResults *pResults)的实现中,最后还要注意释放掉上面弄出来的字串:

... ...
...{
inti;
for(i=0;i<6;i++)
...{
FREEIF(xml.pClrTags[i].lpszOpen);
FREEIF(xml.pClrTags[i].lpszClose);
}

FREEIF(xml.pClrTags);
}

returnpElement;

要想编译通过,还有一个地方要注意的,所有的assert也掉处理掉。经过上述处理,现在这两个文件MCBXml.h/MCBXml.c已经可以嵌入我们的BREW工程中编译成功了。

不过,因为它缺省使用的属性值是不带双引号的,所以还需要做一点修改方便使用:

LPTSTRMcbStrdup(LPCTSTRlpszData,intcbData)
...{
//以下是新的逻辑byYanCheng(2007-12-14)
//去掉引号
LPTSTRlpszNew;

if(cbData==0)cbData=_tcslen(lpszData);
if((lpszData[0]=='"'&&lpszData[cbData-1]=='"')||(lpszData[0]=='''&&lpszData[cbData-1]=='''))
...{
cbData
-=2;
lpszNew
=MALLOC((cbData+1)*sizeof(TCHAR));
if(lpszNew)
...{
MEMCPY(lpszNew,lpszData
+1,(cbData)*sizeof(TCHAR));
lpszNew[cbData]
=(TCHAR)NULL;
}

}

else
...{
lpszNew
=MALLOC((cbData+1)*sizeof(TCHAR));
if(lpszNew)
...{
MEMCPY(lpszNew,lpszData,(cbData)
*sizeof(TCHAR));
lpszNew[cbData]
=(TCHAR)NULL;
}

}


returnlpszNew;

}
/**//*McbStrdup*/

同样,在构造XML字串时,要将这个引号恢复出来,即:

/**//*
*****************************************************
*"Attrib=Value"
*****************************************************
*/

cb
=McbLENSTR(pAttr->lpszValue);

if(cb)
...{

//modifybyyancheng
if(lpszMarker)
...{
lpszMarker[nResult]
=_T('=');
lpszMarker[nResult
+1]=_T('"');
_tcscpy(
&lpszMarker[nResult+2],pAttr->lpszValue);
lpszMarker[nResult
+1+cb+1]=_T('"');
}

nResult
+=cb+1+2;
}


if(lpszMarker)
...{
lpszMarker[nResult]
=_T('');
}


nResult
++;
}
}
break;

我已经将修改后的这两个文件打包放在我的资源中了,可以直接下载使用:http://download.csdn.net/source/313498

最后,简要介绍一下它的使用方法,可参看MCBXml.h中的函数定义,其实是很方便的。

如何解析XML文件,只需要简单地调用McbParseXML完成解析操作,传入的第一个参数是一个XML的字串,返回值是一个McbXMLElement结构类型的变量,McbXMLElement结构定义如下:

typedefstructMcbXMLElement
...{
LPTSTRlpszName;
//元素名称
intnSize;//子节点的个数
intnMax;//最大分配的节点个数
intnIsDeclaration;//是否子节点是XML格式
structMcbXMLNode*pEntries;//子节点数组
structMcbXMLElement*pParent;//父节点
}
McbXMLElement;

由此看出,通过它就可以访问到整个XML的DOM树上的任何一个节点数据了。例如这样:

//加载背景图
for(i=0;i<pXNode->node.pElement->nSize;i++)
...{
if(pXNode->node.pElement->pEntries[i].type==eNodeAttribute&&STRICMP("background",pXNode->node.pElement->pEntries[i].node.pAttrib->lpszName)==0)
...{
pMe
->m_pImageBk=ISHELL_LoadImage(pMe->m_pIShell,pXNode->node.pElement->pEntries[i].node.pAttrib->lpszValue);
if(pMe->m_pImageBk)
pMe
->m_isOwnBk=TRUE;
break;
}

}

这里的pXNode是一个McbXMLNode结构类型的指针变量。

至于如何创建或修改DOM树的内容,也有相应的函数,具体可以参看头文件中的函数定义。我就不罗嗦了。有问题可以与我联系。

分享到:
评论

相关推荐

    可用于BREW平台的XML解析器

    本文将详细介绍一个针对BREW平台优化的XML解析器,名为"可用于BREW平台的XML解析器"。这个解析器是通过对MCBXml源码进行修改而实现的,MCBXml是一个开源的XML解析库,旨在提供高效且轻量级的XML处理能力。 首先,...

    BREW XML 解析

    McbXML是BREW平台上一个专门用于XML解析的库,它是原始XML解析库的修改版,以适应BREW的特性和限制。这个库通常包括两个主要部分:McbXML.cpp和McbXML.h。McbXML.cpp是实现XML解析功能的源代码文件,包含了XML解析的...

    XML解析brew的源代码

    2. **XML解析器**:在BREW平台上,我们需要一个XML解析器来读取和解释XML文档。解析器可以是DOM(Document Object Model)解析器,将整个XML文档加载到内存中形成一棵树形结构;也可以是SAX(Simple API for XML)...

    xml解析brew

    Brew,全称Homebrew,是Mac OS X系统下的一个软件包管理器,它使用XML来存储其元数据,包括软件包的信息、依赖关系等。 在Brew平台中,XML文件解析涉及到以下几个关键知识点: 1. **XML结构**:XML文件由一系列...

    antlr-2.7.6-brew.jar.zip

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于构建语言、工具和框架,如SQL处理器、图形用户界面(GUI)构造器...

    BREW+Programming+guide:BREW编程指南

    #### 第一个BREW应用 - **项目创建**:使用IDE新建BREW项目。 - **代码编写**:按照BREW编程规范编写代码。 - **编译与调试**:利用SDK工具进行编译并使用模拟器进行调试。 #### 完整代码分析 - 分析示例代码中的...

    ads.rar_brew

    例如,`brew install libxml2`可以安装XML解析库。 4. **更新和卸载**:你可以用`brew update`命令来保持Homebrew和其安装的软件包是最新的。如果不再需要某个工具,可以使用`brew uninstall`命令卸载。 5. **环境...

    asp读取xml例子

    本文将详细介绍一个具体的ASP脚本示例,该示例展示了如何使用ASP从XML文件中读取数据。 #### 示例代码解析 首先,让我们逐步分析给定的ASP脚本代码: ```asp response.expires=-1 q=request.querystring("q") ...

    基于BREW平台手机网络浏览器.pdf

    ### 基于BREW平台手机网络浏览器的关键技术解析 #### 摘要 本文深入探讨了一款基于BREW(Binary Runtime Environment for ...这不仅为用户提供了一个流畅的网页浏览体验,也为未来手机浏览器的设计提供了有益的参考。

    xml-coreutils-开源

    "xml-coreutils"就是这样一个开源项目,它提供了一系列基于shell命令行的工具,方便用户对XML文件进行操作,类似于我们熟悉的Unix/Linux系统中的文本处理命令。 在Unix系统中,我们有诸如`grep`、`sed`、`awk`这样...

    libxml2安装包及中文手册

    **libxml2库详解** ...总结来说,libxml2是一个功能丰富的XML处理库,广泛应用于各种平台。了解其安装、功能和使用方法,对于处理XML数据的开发者来说至关重要。同时,配合中文手册,可以极大地提高学习和工作效率。

    libxml2开源库 libxml2开源库 libxml2开源库

    libxml2是一个广泛使用的开源XML解析库,它由Gnome项目维护,并在GNU Lesser General Public License(LGPL)下发布。这个库的主要目标是提供高效、灵活且易于使用的XML处理功能,使得开发人员能够轻松地在各种应用...

    python2.7下lxml库下载安装以及代码示例

    1. **XML解析**:`lxml`提供多种解析XML文档的方式,如`ElementTree API`,`XMLPullParser`,以及基于SAX和DOM的解析器。例如,使用`ElementTree API`解析XML: ```python from lxml import etree xml_string =...

    使用wsdl2objc实现Soap

    `wsdl2objc`是由Salesforce公司开源的一个工具,它能够根据WSDL(Web Service Description Language)文件自动生成Objective-C客户端代码。WSDL是一种XML格式,用于定义SOAP服务的接口、消息结构、操作和绑定。通过...

    TrigML世界时察看器

    总的来说,TrigML世界时察看器巧妙地结合了TrigML语言的计算能力、高通uiOne平台的用户界面设计优势,以及可能隐含的BREW底层支持,为手机用户打造了一个高效、直观的世界时查询工具。无论你身在何处,都能轻松掌握...

    唐诗阅读和分割,对softkey的处理等

    这暗示了该应用可能是一个诗词类的应用程序,它允许用户浏览和阅读唐诗。在实现这一功能时,开发者需要处理文本数据的存储和检索。唐诗的数据通常以文本文件的形式存在,例如在本例中的“tangshi.mif”和“tangshi”...

    flexpart.zip

    3. **NetCDF库**:NetCDF(Network Common Data Form)是一个用于读写大型多维数组的库,是处理气候和气象数据的标准工具。 4. **HDF5库**:HDF5(Hierarchical Data Format 5)是另一个用于存储和管理大量科学数据...

    MAC使用apktool进行反编译

    它能解析APK文件中的资源文件(如XML布局、图片等),并将其转换为人类可读的形式,便于分析和修改。 安装Apktool: 在MAC上安装Apktool,你可以通过Homebrew这个包管理器来完成。首先确保已经安装了Homebrew,如果...

    iOS Sonar集成流程详解

    Sonar是一个用于代码质量管理的强大工具,它可以通过各种插件支持多种编程语言。在iOS开发领域,Sonar可以帮助开发者实现代码的质量控制,提高软件的整体质量。Sonar能够提供以下几个方面的支持: 1. **技术债务**...

Global site tag (gtag.js) - Google Analytics