xerces解析器的使用实例详解
来源:互联网 发布:股票下跌提醒软件 编辑:程序博客网 时间:2024/06/05 01:08
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/sax/SAXException.hpp> #include <xercesc/dom/DOMException.hpp>#include <xercesc/dom/DOMLSOutput.hpp>#include <xercesc/dom/DOMElement.hpp>#include <xercesc/dom/DOMAttr.hpp>#include <xercesc/dom/DOMLSSerializerFilter.hpp>#include <xercesc/dom/DOMNodeList.hpp>#include <xercesc/dom/DOMDocument.hpp> #include <xercesc/dom/DOMLSException.hpp> #include <xercesc/parsers/SAXParser.hpp>#include <xercesc/dom/DOMLSSerializer.hpp>#include <xercesc/framework/MemBufInputSource.hpp>#include <xercesc/util/OutOfMemoryException.hpp>#include <xercesc/util/BinInputStream.hpp>#include <xercesc/util/TransService.hpp>#include <xercesc/dom/DOMLSParserFilter.hpp>#include <xercesc/dom/DOMImplementation.hpp>#include <xercesc/dom/DOMImplementationRegistry.hpp>#include <xercesc/framework/MemBufFormatTarget.hpp>#include <iostream>using namespace XERCES_CPP_NAMESPACE;using namespace std;static const char* gMemBufId = "prodInfo";static char g_newNodeName[4][20]={"bal_ye","bal_ky","bal_kq","bal_dj"};static char g_typeValue[4][10] = {"0","1","2","3"};extern "C" bool DoRecving(char* pDatabuf, int iLen,char* pNewBuf,int* iRetLen,int iNewLen);extern "C" void RemoveNode(DOMDocument* pDoc,DOMElement* tagNode);extern "C" void RemoveNode(DOMDocument* pDoc,DOMElement* tagNode){ if (tagNode == NULL|| pDoc == NULL) { return ; } DOMElement* newElementNode; //DOMText* newTextNode; DOMElement* typeNode = tagNode->getFirstElementChild(); DOMElement* balNode = typeNode->getNextElementSibling(); char* typeValue = XMLString::transcode(typeNode->getTextContent()); for (int i=0;i<4;i++) { XMLCh* newNodeName = XMLString::transcode(g_newNodeName[i]); if (strcmp(typeValue,g_typeValue[i])==0) { newElementNode=pDoc->createElement(newNodeName); XMLString::release(&newNodeName); break; } XMLString::release(&newNodeName); } DOMNode* parentNode = tagNode->getParentNode(); newElementNode->appendChild(typeNode); newElementNode->appendChild(balNode); parentNode->insertBefore(newElementNode,tagNode->getNextElementSibling()); parentNode->removeChild(tagNode); return ;}extern "C" void Work(DOMDocument* pDoc,DOMElement * element){ while(element) { DOMElement* nextNode; char* elementName = XMLString::transcode(element->getTagName()); if (strcmp(elementName,"ScBal")==0) { nextNode = element->getNextElementSibling(); RemoveNode(pDoc,element); element = nextNode; } else if(elementName,"MsgHdr") { DOMElement* elementChild = element->getFirstElementChild(); while(elementChild) { elementName = XMLString::transcode(elementChild->getTagName()); if (strcmp(elementName,"InstrCd")==0) { char* tranCode = XMLString::transcode(elementChild->getTextContent()); if (strcmp(tranCode,"11008") != 0) { XMLString::release(&tranCode); return ; } else { break; } } elementChild = elementChild->getNextElementSibling(); } element = element->getNextElementSibling(); } else { element = element->getNextElementSibling(); } XMLString::release(&elementName); }}extern "C" DOMDocument* LoadMem(MemBufInputSource* pMemBufIS,XercesDOMParser* pParser,const char* pDatabuf){ MemBufInputSource* memBufIS = new MemBufInputSource ( (const XMLByte*)pDatabuf , strlen(pDatabuf) , gMemBufId , false ); pMemBufIS = memBufIS; XercesDOMParser* parser = new XercesDOMParser; try { parser->parse(*memBufIS); } catch (SAXException& e) { printf("msg:%s\n", XMLString::transcode(e.getMessage())); return NULL; } catch (XMLException& e) { printf("code:%d, msg:%s\n", e.getCode(), XMLString::transcode(e.getMessage())); return NULL; } catch (DOMException& e) { printf("code:%d, msg:%s\n", e.code, e.msg); return NULL; } DOMDocument* pDoc = NULL; try { pDoc = parser->getDocument(); if(pDoc == NULL) { printf("pDoc fail \n"); } } catch (DOMLSException& e) { printf("code:%d, msg:%s\n", e.code, e.msg); return NULL; } catch (DOMException& e) { printf("code:%d, msg:%s\n", e.code, e.msg); return NULL; } return pDoc;}extern "C" bool DoRecving(char* pDatabuf, int iLen,char* pNewBuf,int* iRetLen,int iNewLen){ string shead = "<?xml version=\"1.0\" encoding=\"GBK\"?>"; printf("\n%s\n",pDatabuf); printf("%d",strlen(pDatabuf)); XMLPlatformUtils::Initialize(); MemBufInputSource* pMemBufIS = NULL; XercesDOMParser* pParser = NULL; DOMDocument* pDoc =LoadMem(pMemBufIS,pParser,pDatabuf); DOMElement* root = pDoc->getDocumentElement(); if (root == NULL) { delete pMemBufIS; delete pParser; pMemBufIS = NULL; pParser = NULL; shead.append(pDatabuf); pDoc = LoadMem(pMemBufIS,pParser,shead.c_str()); } root = pDoc->getDocumentElement(); if(root == NULL) { delete pMemBufIS; delete pParser; pMemBufIS = NULL; pParser = NULL; return false; } DOMElement* firstNode = root->getFirstElementChild(); DOMElement* temNode = firstNode; for (int i=0;i<2;i++) { temNode = temNode->getFirstElementChild(); } Work(pDoc,temNode); try { XMLCh tempStr[3] = { chLatin_L, chLatin_S, chNull }; DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput(); //TranscodeToStr transcodeToStr(theSerializer->writeToString(root),"gbk",XMLPlatformUtils::fgMemoryManager); const char* gbk = "GBK"; char* data = (char*)TranscodeToStr(theSerializer->writeToString(root),gbk).adopt(); // char datalen[10]={0}; // int ndatalen = strlen(data); printf("\nempty = %s\n",data); printf("\n*******ndatalen = %d\n",ndatalen); sprintf(datalen,"%05d",ndatalen); firstNode = pDoc->getDocumentElement(); firstNode->setAttribute( XMLString::transcode("Len"),XMLString::transcode(datalen)); MemBufFormatTarget *myFormTarget; myFormTarget = new MemBufFormatTarget(2000, XMLPlatformUtils::fgMemoryManager); theOutputDesc->setByteStream(myFormTarget); theSerializer->write(pDoc, theOutputDesc); XMLFormatter *formatter = new XMLFormatter("gbk",myFormTarget); const XMLByte* toWrite = new XMLByte[2000]; toWrite = myFormTarget->getRawBuffer(); memcpy(pNewBuf,toWrite,strlen((char*)toWrite)); *iRetLen = strlen(pNewBuf); printf("\n====pNewBuf = %s\n",pNewBuf); theOutputDesc->release(); theSerializer->release(); XMLString::release(&data); delete formatter; delete myFormTarget; } catch (const OutOfMemoryException&) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; return false; } catch (XMLException& e) { XERCES_STD_QUALIFIER cerr << "An error occurred during creation of output transcoder. Msg is:" << XERCES_STD_QUALIFIER endl << XMLString::transcode(e.getMessage()) << XERCES_STD_QUALIFIER endl; return false; } delete pMemBufIS; delete pParser; return true;}
1 0
- xerces解析器的使用实例详解
- 在SunOS5.8/solaris7上使用Xerces-C解析器
- Xerces-C++解析xml实例指导
- Apache xerces xml解析器
- 使用Apache Xerces解析XML文档
- 使用Apache Xerces解析XML文档
- 使用Apache Xerces解析XML文档
- 使用Apache Xerces解析XML文档
- 使用Apache Xerces解析XML文档
- 使用Apache Xerces解析XML文档
- xerces-c解析中文的简单方法
- 关于xerces解析中文的问题
- 推荐一种XML解析器 --- Xerces C++
- 使用xerces库的一个注意事项
- (转)使用Apache Xerces解析XML文档
- XML解析简介及Xerces-C++简单使用举例
- XML解析简介及Xerces-C++简单使用举例
- xerces dom xml解析
- Android6.0之AMS如何启动app中篇之Task的管理
- cocos2d-x ui::Button 的setEnabled 和 setVisible 的区别,setEnabled后按钮却不见了
- JFreeChart样式设置
- visual studio和远程sql server数据库连接
- MTK lk源码解析8( lk 阶段exceptions.S 解析)
- xerces解析器的使用实例详解
- Html5,Java WebSocket简单实现
- 深入理解:Android 编译系统
- C_sharp:一个菜鸟学习历程
- Blockly学习之文档阅读笔记
- CentOS7环境下搭建flume
- React系列之--组件的生命周期
- 装饰器模式
- 注解(Annotation)自定义注解(一)