Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ and MSXML (a newbie question)

neau33 [18.05.2011 15:18:08]

#

Moi!

Olen muutaman päivän ajan yritellyt päästä sisälle C++ ohjelmoinin saloihin, ympäristönä Microsoft Visula C++ 6.0 / Win32 Console). Potkun aiheeseen sain täältä... Mutta mitä 'enemmän' muutoin pääsen sisälle, sitä sekavammaksi käyvät MSXML kuviot. Elikäs: Please tell me, että millä ****lla saan ladattua XML-datan IXMLDocument-objektiin???

tässä koodisample:

// ReadTableFromPage.cpp : Defines the entry point for the console application.
//
#define UNICODE

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <atlbase.h>
#include <atlconv.h>
#include <comdef.h>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet.lib")
#import <msxml6.dll> named_guids
#pragma comment(lib,"msxml6.lib")

using namespace std;
using namespace MSXML2;

int main(int argc, char* argv[])
{
   USES_CONVERSION;

   char Buf[1024]; DWORD ReadSize;
   BOOL bResult; string str;

   HINTERNET hInternet = InternetOpenA(
   "UsewrAgent/1.0",INTERNET_OPEN_TYPE_PRECONFIG,
   NULL,NULL,0);
   if(!hInternet)
   {
      printf("hInternet Failed!\n");
      return -1;
   }

   HINTERNET hConnection = InternetConnectA(
   hInternet,
   "http://www.elisanet.fi/nea.fi/tablex",
   INTERNET_DEFAULT_HTTPS_PORT,
   "","", INTERNET_SERVICE_HTTP,0,0);

   if (!hConnection)
   {
      InternetCloseHandle(hInternet);
      printf("InternetConnectA failed!\n");
      return -1;
   }

   HINTERNET hFile = InternetOpenUrl(
   hInternet,
   "http://www.elisanet.fi/nea.fi/tablex",
   NULL,0,INTERNET_FLAG_RELOAD,0);
   if(!hFile)
   {
      InternetCloseHandle(hConnection);
      InternetCloseHandle(hInternet);
      printf("InternetOpenUrl Failed!\n");
      return -1;
   }

   for(;;)
   {
      ReadSize = 1024;

      bResult = InternetReadFile(
      hFile,Buf,1024,&ReadSize);

      if(bResult && (ReadSize == 0)) break;

      Buf[ReadSize] = '\0'; str+=("%s", Buf);
   }

   InternetCloseHandle(hFile);
   InternetCloseHandle(hConnection);
   InternetCloseHandle(hInternet);

   size_t ltag; size_t utag;
   ltag = str.find("</table>");
   utag = str.find("</TABLE>");

   string stag; string etag;

   if(int(ltag) > -1)
   {
      stag = "<table"; etag = "/table";
   }
   else if(int(ltag) < 0 && int(utag) > -1)
   {
      stag = "<TABLE"; etag = "/TABLE";
   }
   else if(int(ltag) == -1 && int(utag) == -1)
   {
      printf("Requested page has no table element!\n");
      return -1;
   }

   size_t spos; spos = str.find(stag);
   size_t epos; epos = str.find(etag);

   spos -= 1; epos += 7; string xmlstr;

   xmlstr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
   xmlstr +=  str.substr(spos, epos-spos);

   CComBSTR cbstrData(xmlstr.c_str());
   BSTR bstrXml = cbstrData.Copy();

   SysFreeString(cbstrData); xmlstr="";

   HRESULT hr;
   hr = CoInitialize(NULL);

   if(FAILED (hr))
   {
      printf("HRESULT Initialization failed!\n");
      SysFreeString(bstrXml);
      return -1;
   }

   IXMLDOMDocumentPtr pDoc = NULL;
   pDoc.CreateInstance(__uuidof(DOMDocument));
   if(pDoc==NULL)
   {
      printf("DOMDocument creation failed!\n");
      SysFreeString(bstrXml);
      return -1;
   }

   CComPtr<IXMLDOMDocument> xmlDoc;
   xmlDoc = (IXMLDOMDocument*)pDoc;
   pDoc = NULL;

   xmlDoc->put_async(VARIANT_TRUE);
   xmlDoc->put_preserveWhiteSpace(VARIANT_TRUE);
   xmlDoc->put_validateOnParse(VARIANT_FALSE);

   hr = xmlDoc->loadXML(bstrXml);
   if(FAILED (hr))
   {
      printf("Loading .xml data failed!\n");
      SysFreeString(bstrXml);
      return -1;
   }

   _bstr_t xmldata;
   xmldata = xmlDoc->Getxml();

   string chkstr = OLE2CA(xmldata);

   BOOL bStillNotLoaded;

   if(chkstr == "")
   {
      SysFreeString(xmldata);
      bStillNotLoaded = TRUE;
   }
   else
   {
      cout << OLE2CA(xmldata) <<  endl;
      cout << "\nXML data successfully loaded to IXMLDocument object!" << endl;
      SysFreeString(xmldata);
      SysFreeString(bstrXml);
   }

   if(bStillNotLoaded)
   {
      cout << OLE2CA(bstrXml) << endl;
      cout << "\nXML data still not loaded to IXMLDocument object!" << endl;
      SysFreeString(bstrXml);
   }

   return 0;
}

neau33 [18.05.2011 21:42:09]

#

Heippa taas!

ongelman ratkaisu

XYZ [20.05.2011 21:38:20]

#

Tämä nyt voi olla huono ohje, mutta käytä TinyXml:ää
http://www.grinninglizard.com/tinyxml/

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta