xml初级操作
来源:互联网 发布:知乎杀人案烟锁殡仪馆 编辑:程序博客网 时间:2024/06/06 19:18
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解析办法之外提供了另外一个可行的解决方案。
使用getNodeValue()时,在移到结点时还得使用getFirstNode然后使用getNodeValue,如果在当前情况下使用getNodeName 结果为#text
#include "head.h"
#include "xmlhead.h"
using namespace std;
using namespace XERCES_CPP_NAMESPACE;
DOMElement* GetElementByName (const DOMNode *elem, const string &val);
int main()
{
XMLPlatformUtils::Initialize();
//string strLicname = "/usr/local/TmsSystem/cpp/TmsLicense.xml";
string strLicname = "TmsLicense.xml";
//string strLicname = "test.txt";
string strData;
//readFileData(strLicname,Data);
{
struct stat statBuf;
size_t uLen = 0;
int iRet;
FILE*pFile = fopen(strLicname.c_str(), "rb");
if (!pFile)
return E_FAIL;
if ((stat(strLicname.c_str(), &statBuf)) < 0)
return E_FAIL;
else
uLen = statBuf.st_size;
printf("len of file =%d\n", uLen);
char *pDataBuf = new char[uLen];
memset(pDataBuf, 0, sizeof(pDataBuf));
iRet = fread(pDataBuf, uLen, 1, pFile);
if (iRet < 0)
{
printf("read data is 0\n");
delete []pDataBuf;
return E_FAIL;
}
strData = pDataBuf;
fclose(pFile);
}
string crtfromxml;
//Parser_LicenseFile_Key(strData, crtfromxml)
{
printf("begin Parser_LicenseFile_Key \n");
XercesDOMParser * parser = new XercesDOMParser();
//XercesDOMParser * parser = (XercesDOMParser *)malloc(sizeof(
//XercesDOMParser));
printf("begin Parser_LicenseFile_Key \n");
ErrorHandler * errHandler = (ErrorHandler*) new HandlerBase();
//ErrorHandler * errHandler = (ErrorHandler*)malloc(sizeof( HandlerBase));
DOMElement *rootChild = NULL;
//GetRootChild(strdata, parser, errHandler, rootChild)
{
string compactXml = strData;
if( compactXml.empty())
{
printf("compactXml is null\n");
return E_FAIL;
}
parser->setErrorHandler(errHandler);
MemBufInputSource input( (const XMLByte*)compactXml.c_str(),
compactXml.size(),"xml");
try
{
parser->parse(input);
}
catch(...)
{
printf("catch input\n");
return -2;
}
DOMDocument *doc = parser->getDocument();
rootChild = doc->getDocumentElement();
char *p = (char*)XMLString::transcode(rootChild->getNodeName());
string dest = p;
cout << "rootChild:" << dest << endl;
if (rootChild == NULL)
{
printf("doc->getDocumentElement is wrong\n");
return E_FAIL;
}
//Parser_LicenseFile_Key_XML(rootChild,crtfromxml);
{
printf("begin Parser_LicenseFile_Key_XML\n");
DOMElement *child=GetElementByName(
// rootChild->getFirstChild(), "Signature");
rootChild->getFirstChild(), "Model");
if (child == NULL)
{
printf("DOMElement is wrong\n");
}
}
}
}
return E_OK;
}
DOMElement* GetElementByName (const DOMNode* elem, const string &name)
{
if(NULL == elem || name.empty())
{
printf("elem or name is null\n");
return NULL;
}
string source = name;
//for_each(source.begin(), source.end(),ToLower);
DOMElement * child = (DOMElement*)elem;
for (; child != NULL;)
//child = (DOMElement*)child->getNextSibling());
{
//printf("sss\n");
if (NULL == child)
{
printf("elem child is wrong\n");
return NULL;
}
char *p = (char*)XMLString::transcode(child->getNodeName());
//char *pValue;
char *pValue = (char*)XMLString::transcode(child->getTextContent());
if (NULL == pValue)
{
printf ("child->getNodeValue\n");
return NULL;
}
string dest = p;
if (dest == "#text")
return NULL;
string strValue = pValue;
cout << "Node:" << dest << endl;
cout << "Value" << pValue << endl;
while(1)
;
if (dest == name)
{
char *pValue = (char*)XMLString::transcode(child->getFirstChild()->getNodeValue());
string strValue = pValue;
cout << "Current Node:" << dest << endl;
cout << "Current Name:" << name << endl;
string strNext=(char*)XMLString::transcode(child->getFirstChild()->getNodeName());
cout << "child Value:" << strValue << endl;
cout << "child Node:" << strNext << endl;
}
//cout << "Value:" << strValue << endl;
//string tmp = "SerialNumber";
GetElementByName (child->getFirstChild(),name);
child = (DOMElement*)child->getNextSibling();
XMLString::release(&p);
//for_each(dest.begin(), dest.end(), ToLower);
//if (source == dest)
//return child;
}
return NULL;
}
0 0
- xml初级操作
- xml初级
- 初级操作
- TestNG.XML初级指南
- TestNG.XML初级指南
- vim 初级操作
- Java Mysql 初级操作
- SQLite初级操作
- mysql 初级操作
- RecyclerView初级操作
- MYSQL初级数据库操作
- Dom4j 解析XML (初级入门)
- XML总结. <DTD定义初级>
- mybatis-初级篇-UserMapper.xml
- python -初级学习—xml
- SQL server2000的初级操作
- linux基本指令操作-初级
- MapReuce-Join操作-初级优化
- 内核模块编译-helloworld
- jquery开发框架遇到TAB页没有关闭按钮的处理办法。
- mybatis工作遇到的问题
- Linux下gcc/g++、make和cmake的区别
- 避免外置存储器中的应用多媒体数据被系统的媒体数据库扫描到
- xml初级操作
- Android fragment(片段)构建灵活的UI
- swift地图定位(八)获取当前城市名称(定位+反地理编码)
- stringIO 和 BytesIO
- Android Studio 快捷键
- ucosIII 任务同步(信号量、任务信号量、事件标记组)
- laravel5.1文档翻译(新手练习持续更新)
- 结合Wireshark深入理解TCP/IP协议
- 微信小程序的开发实例