¡¾·±ÌåÖÐÎÄ¡¿
¡¾ÉèΪÊ×Ò³¡¿
¡¾¼ÓÈëÊղء¿
µ±Ç°Î»Öãº.Net¼¼ÊõÊ×Ò³ >> ÆÀÂÛ¼°ÆäËü >> Tuxedo 8.1 XML C++ ParserµÄʹÓã¨×ª×ÔBEAÖйúÍøÕ¾£©

Tuxedo 8.1 XML C++ ParserµÄʹÓã¨×ª×ÔBEAÖйúÍøÕ¾£©

2005-01-09 20:54:52  ×÷Õߣºneptuner  À´Ô´£º»¥ÁªÍø  ä¯ÀÀ´ÎÊý£º6  ÎÄ×Ö´óС£º¡¾´ó¡¿¡¾ÖС¿¡¾Ð¡¡¿
¼ò½é£º ±êÌ⣺Tuxedo 8.1 XML C++ ParserµÄʹÓà ä¯ÀÀ´ÎÊý£º ʱ¼ä£º2003-12-05 ×÷Õߣº¾­Ç¬£¨dev2dev ID: jq75£© BEAϵͳ£¨Öйú£©ÓÐÏÞ¹«Ë¾ ÇþµÀ²¿¼¼Êõ¹ËÎÊ ÔÚ...

±êÌ⣺Tuxedo 8.1 XML C++ ParserµÄʹÓÃ

ä¯ÀÀ´ÎÊý£º

ʱ¼ä£º2003-12-05

×÷Õߣº¾­Ç¬£¨dev2dev ID: jq75£© BEAϵͳ£¨Öйú£©ÓÐÏÞ¹«Ë¾ ÇþµÀ²¿¼¼Êõ¹ËÎÊ

ÔÚTUXEDO 8.0ÖУ¬¿Í»§»úºÍ·þÎñÆ÷Ö®¼ä¿ÉÒÔʹÓÃXML»º³åÇø½øÐÐÊý¾Ý½»»»£¬µ«ÓÉÓÚ8.0°æ±¾Ã»Óм¯³ÉXML Parser£¬ËùÒÔ¶ÔXMLµÄÖ§³ÖÊÇÓÐÏ޵ġ£´Ó8.1°æ±¾¿ªÊ¼£¬TUXEDO¼¯³ÉÁËApache Xerces C++ Parser 1.7£¬ÕâÑù·þÎñÆ÷¶Ë¾Í¿ÉÒÔÖ±½Ó·ÖÎöXMLÎĵµÁË£¬¶ø²»ÓÃÔÙÈ¥µ÷ÓÃÆäËüXML Parser¡£

TUXEDO 8.1µÄsamplesÖиøÁËÒ»¸öxmlstockappÀý×Ó£¬ÓÉÓÚËüÌ«¸´ÔÓ£¨ÖÁÉÙÎÒÕâôÈÏΪ£©£¬Òò´Ë£¬±¾ÎĽ«Í¨¹ýÒ»¸ö¼òµ¥ÊµÓõÄÀý×ÓÀ´½éÉÜXML»º³åÇøÊ¹Óá£

Ò»£®XML»º³åÇøµÄ·ÖÅäºÍ´«Êä

XML»º³åÇøÖ§³ÖµÄ×î´ó³¤¶ÈÊÇ4GB£¬·ÖÅä·½·¨ÓëCARRAY»º³åÇøÒ»Ñù£¬ÐèÒªÖ¸¶¨³¤¶È¡£¿Í»§¶ËÐèÒª´ò¿ªÒ»¸öXMLÎĵµ£¬ÒÔ×Ö·û·½Ê½¶ÁÈ¡ÎĵµÄÚÈÝ£¬±£´æµ½»º³åÇøÖУ¬È»ºóÓÉtpcall()µ÷ÓÃÌá½»¸ø·þÎñ½ø³Ì¡£Çåµ¥1-1ÊÇͨÐżӦÓóÌÐòµÄXML¿Í»§»ú´úÂë¶Î¡£

Çåµ¥1-1 XML»º³åÇø¿Í»§»ú´úÂë¶Î£¬ÎļþÃû£ºXML_cli.c

#define XMLDOCSIZE 1048576

... ...

FILE *xml_fd;

char *xml_buffer = NULL;

if ((xml_fd = fopen("friends.xml", "r")) != NULL) {

xml_buffer = (char *)malloc(sizeof(char) * XMLDOCSIZE);

nsize = fread(xml_buffer, sizeof(char), XMLDOCSIZE, xml_fd);

}

sendlen = nsize + 1; /* ʵ¼Ê¶ÁÈ¡µÄ³¤¶È */

if((sendbuf = (char *) tpalloc((char *)"XML", NULL, sendlen)) == NULL) {

fprintf(stderr,"Error allocating send buffer, tperrno=%ld\n",tperrno);

tpterm();

return(1);

}

strncpy(sendbuf, xml_buffer, nsize);

ret = tpcall((char *)"ADD_FRIEND", (char *)sendbuf, sendlen, (char **)&rcvbuf, &rcvlen, TPNOTIME);

... ...

¸´ÖƵ½»º³åÇøµÄXMLÎļþ±ØÐë×ñÑ­1.0±ê×¼£¬¿ÉÒÔ°üº¬ÈκÎ×Ô¶¨ÒåµÄ±ê¼Ç¡£±¾ÀýÖÐÓõ½ÁËfriends.xml£¬Õâ¸öÎļþ°üº¬ÁËÁ½ÌõÒªÌí¼Óµ½Êý¾Ý¿âºÃÓÑÐÅÏ¢£¬ÄÚÈÝÈçÇåµ¥1-2Ëùʾ¡£

Çåµ¥1-2 XMLÎļþʾÀý£¬ÎļþÃû£ºfriends.xml

1

JQ

13910793488

2

Snna

13663129935

¶þ£®»ùÓÚXML±ê¼ÇµÄDDR

XML»º³åÇøÖ§³Ö»ùÓÚ±ê¼ÇÖµµÄDDR£¬¶ÔÓÚͨÐżӦÓóÌÐòÀ´Ëµ£¬Èç¹ûÎÒÃÇÒª°Ñfriend_idȡֵÔÚ1-10·¶Î§ÄڵļǼ±£´æÔÚtable1ÖУ¬°ÑȡֵÔÚ11-20·¶Î§ÄڵļǼ±£´æÔÚtable2ÖУ¬°ÑÆäËüȡֵ·¶Î§µÄ¼Ç¼±£´æÔÚtable3ÖУ¬Ôò¿ÉÒÔÔÚubbÅäÖÃÎļþÖж¨ÒåÏÂÃæµÄ·Óɱê×¼À´ÊµÏÖ£º

*ROUTING

symbol FIELD="friends/friend/ friend_id"

BUFTYPE="XML"

FIELDTYPE=LONG

RANGES="1-10:GROUP1,11-20:GROUP2,*:GROUP3"

XML»º³åÇøµÄ·ÓÉ×ֶλ¹¿ÉÒÔÊÇSTRINGÀàÐ͵ģ¬ÕâʱRANGESµÄȡֵ±ØÐëÓõ¥ÒýºÅÒýÆðÀ´£¬Çë¿´ÈçÏ´úÂë¶Î£º

*ROUTING

symbol FIELD="stockquotes/stock_quote/symbol"

BUFTYPE="XML"

FIELDTYPE=STRING

RANGES="'BEAS'-'BEAS':GROUP1, 'MSFT'-'MSFT':GROUP2"

Èý£®XML»º³åÇøµÄ·ÖÎö

·þÎñÆ÷¶ËÊÕµ½XML»º³åÇøºó£¬ÐèÒª¶ÔËü½øÐзÖÎö£¬´ÓÖÐÈ¡³ö±ê¼ÇÖµ¡£Tuxedo 8.1¼¯³ÉÁËApache Xerces C++ Parser 1.7£¬²¢ÌṩÁËÁ½ÖÖÀàÐ͵ķÖÎöÆ÷£ºSAX ParserºÍDOM Parser£¬·þÎñÆ÷¶Ëͨ³£Ê¹ÓÃDOM Parser£¬¿Í»§¶Ëͨ³£Ê¹ÓÃSAX Parser¡£Ê¹ÓÃXerces C++ ParserµÄ²½ÖèÒ»°ãÊÇ£º

· ³õʼ»¯XMLC42ϵͳ£»

¡¡XMLPlatformUtils::Initialize();

· ¸ù¾ÝXML»º³åÇø´´½¨MemBufferInputSource£»

¡¡MemBufInputSource* memBufIS =

¡¡new MemBufInputSource( (const XMLByte*)xmlbuf, strlen(xmlbuf), bufId, false);

· ´´½¨SAX Parser»òDOM Parser£»

¡¡DOMParser *parser = new DOMParser;

¡¡SAXPArser *parser = new SAXParser;

· ¶ÔÓÚSAX Parser£¬ÐèҪΪÎĵµºÍ´íÎó´¦ÀíÉèÖûص÷º¯Êý£»

¡¡SAXPrintHandlers handler;

¡¡parser->setDocumentHandler(&handler);

¡¡parser->setErrorHandler(&handler);

· µ÷ÓÃXerces C++ Parser·ÖÎöXML»º³åÇø£»

¡¡parse->parse(*memBufIS);

· ɾ³ýParserºÍMemBufferInputSource£»

¡¡delete parser;

¡¡delete memBufIS;

· Í˳öXMLC42ϵͳ£»

¡¡XMLPlatformUtils::Terminate();

¶ÔÓÚͨÐżӦÓóÌÐòÀ´Ëµ£¬¿Í»§»ú¸ø·þÎñÆ÷´«µÝÁËfriends.xmlÎļþ£¬·þÎñÆ÷¶Ë´´½¨ÁËÒ»¸öDOM Parser¶ÔËü½øÐзÖÎö£¬²¢°Ñ½á¹û´æÈëÊý¾Ý¿â£¬´úÂëÈçÇåµ¥1-3Ëùʾ¡£

Çåµ¥1-3 XML»º³åÇøµÄ·þÎñÆ÷´úÂ룬ÎļþÃû£ºXML_serv.pc

#include

#include

#include

#include

#include

#include

#include

char *localbuf=NULL;

static const char* bufId = "mybuf";

EXEC SQL begin declare section;

static long friend_id;

static char fname[10];

static char fmobile[14];

EXEC SQL end declare section;

EXEC SQL INCLUDE sqlca;

void TopTree( DOM_Node node);

void SubTree( DOM_Node node);

void parseXMLBuffer(char** xmlbuf);

#ifdef __cplusplus

extern "C"

#endif

void

#if defined(__STDC__) || defined(__cplusplus)

ADD_FRIEND(TPSVCINFO *rqst)

#else

ADD_FRIEND(rqst)

TPSVCINFO *rqst;

#endif

{

parseXMLBuffer(&rqstàdata);

tpreturn(TPSUCCESS, 0, xmlbuf, rqstàlen, 0);

}

void parseXMLBuffer(char** xmlbuf)

{

int errorCount ;

localbuf = (char *)malloc(sizeof(char *) * 2048);

XMLPlatformUtils::Initialize();

MemBufInputSource* memBufIS =

new MemBufInputSource( (const XMLByte*)*xmlbuf, strlen(*xmlbuf)-1, bufId, true);

DOMParser *parser = new DOMParser;

parseràparse(*memBufIS);

if ((errorCount = parseràgetErrorCount()) == 0)

{

DOM_Document document = parseràgetDocument();

DOM_Element topLevel = document.getDocumentElement();

TopTree(topLevel);

}

delete parser;

delete memBufIS;

XMLPlatformUtils::Terminate();

}

void TopTree( DOM_Node node){

if (node.getNodeType() == DOM_Node::ELEMENT_NODE)

{

if (node.getNodeName().equals ("friend")) SubTree(node);

else

{

DOM_NodeList children = node.getChildNodes();

for (int i=0; i

}

}

}

void SubTree( DOM_Node node)\

{

DOM_NodeList children = node.getChildNodes();

for (int i=0; i

{

DOM_Node nod = children.item(i);

if(nod.getNodeType()==DOM_Node::ELEMENT_NODE)

{

if(nod.getNodeName().equals("friend_id"))

friend_id = atol(nod.getFirstChild().getNodeValue().transcode());

else if(nod.getNodeName().equals("fname"))

strcpy(fname, nod.getFirstChild().getNodeValue().transcode());

else if(nod.getNodeName().equals("fmobile"))

strcpy(fmobile, nod.getFirstChild().getNodeValue().transcode());

}

}

EXEC SQL insert into FRIEND (FRIEND_ID,NAME,MOBILE)

values (:friend_id, :fname, :fmobile);

if (SQLCODE != SQL_OK) userlog("Cannot insert into FRIEND");

}

×¢Ò⣺·þÎñÆ÷ÎļþÃûΪXML_serv.pc£¬ÏÈҪʹÓÃesqlcÃüÁî¶ÔËü×÷Ô¤±àÒ룬Éú³ÉCÔ´³ÌÐò£¬È»ºó°ÑÀ©Õ¹Ãû¸ÄΪcpp£¬²ÅÄÜÓÃbuildserverÀ´±àÒ룬ԭÒòÊÇXerces C++ ParserÖ»ÌṩÁËC++µÄ±à³Ì½Ó¿Ú¡£¶ÁÕß¿ÉÒԲο¼ÈçÏÂÃüÁîÀ´±àÒ룺

proc iname=XML_serv.pc oname=XML_serv.cpp

buildserver -v -s ADD_FRIEND -f XML_serv.cpp -o XML_serv -f %TUXDIR%\lib\libtxml.lib

ËÄ£®UBBConfigNTÅäÖÃÎļþµÄ±àд

Õâ¸öÀý×ÓʹÓÃÁËOracle8iÊý¾Ý¿âÀ´²âÊÔ£¬TuxedoµÄÅäÖÃÎļþÈçÇåµ¥1-4Ëùʾ¡£

Çåµ¥1-4 TuxedoµÄÅäÖÃÎļþ£¬ÎļþÃû£ºUBBConfigNT

*RESOURCES

IPCKEY 123456

DOMAINID simpapp

MASTER SITE1

MAXACCESSERS 10

MAXSERVERS 5

MAXSERVICES 10

MODEL SHM

LDBAL N

*MACHINES

DEFAULT:

APPDIR="C:\TuxDAP\solutions\xml"

TUXCONFIG="C:\TuxDAP\solutions\xml\tuxconfig"

TUXDIR="G:\bea\tuxedo"

TLOGNAME=TLOG

TLOGDEVICE="C:\TuxDAP\solutions\xml\TLOG"

JQ LMID=SITE1

*GROUPS

DEFAULT: LMID=SITE1

GROUP1 LMID=simple GRPNO=1

OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=oradb+SesTm=120+

MaxCur=5+LogDir=."

TMSNAME="TMS_ORA8i" TMSCOUNT=2

*SERVERS

DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"

XML_serv SRVGRP=GROUP1 SRVID=10

*SERVICES

ADD_FRIEND

*ROUTING

Î壮ÔËÐвâÊÔ

Ö´ÐÐXML_Cli.exe½øÐвâÊÔ£¬friends.xmlÎļþÒѾ­Í¨¹ýXML»º³åÇø³É¹¦µØ·¢Ë͵½·þÎñÆ÷¶Ë£»

´ò¿ªSQL*PLUS£¬²é¿´Ò»ÏÂFRIEND±íµÄÄÚÈÝ£¬·¢ÏÖÀïÃæÒѾ­²åÈëÁËÁ½Ìõ¼Ç¼£¬ÕâÁ½Ìõ¼Ç¼µÄÊý¾Ý¾ÍÊÇͨ¹ýfriends.xmlÎļþÀ´´«ÊäµÄ£¡

ÔðÈα༭£ºadmin
±¾ÎÄÒýÓõØÖ·£º http://www.3pcode.com/net/2005/01/45028.htm
Ïà¹ØÎÄÕÂ