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
原创粉丝点击