±êÌ⣺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
¶þ£®»ùÓÚ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ÎļþÀ´´«ÊäµÄ£¡

