xml初级操作


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小喾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值