我想用XML类型的文件记录一些点并和数据库里面的字段对应起来。XML文件格式如下
<pic cx="200" cy="200">
   <ID DeviceID="1000">
        <point x="150" y="120"/>
   </ID>
   <ID DeviceID="1001">
        <point x="50" y="30"/>
   </ID>
   <ID DeviceID="1002">
        <point x="70" y="10"/>
   </ID>
</pic>不想使用现成的类如mackup,tinyxml等,而直接使用MSXML对他们进行创建,插入,修改,删除,查询等操作,也就是把它当成一个数据库,该如何实现阿?我对VC下的MSXML操作不明白。看了网上很多例子和源码,讲解的都不是很全面。希望高人帮帮忙。
插入,修改,删除,查询操作只对下面这样的节点进行:
   <ID DeviceID="1002">
        <point x="70" y="10"/>
   </ID>
例如文件已经建立我需要插入一条记录
   <ID DeviceID="1003">
        <point x="50" y="20"/>
   </ID>
则变成
<pic cx="200" cy="200">
   <ID DeviceID="1000">
        <point x="150" y="120"/>
   </ID>
   <ID DeviceID="1001">
        <point x="50" y="30"/>
   </ID>
   <ID DeviceID="1002">
        <point x="70" y="10"/>
   </ID>
   <ID DeviceID="1003">
        <point x="50" y="20"/>
   </ID>
</pic>
希望各位大侠来点干的,别糊弄阿。

解决方案 »

  1.   

    如果不用现成的类,MSXML可能适合你。参看这篇文章:
    http://www.vckbase.com/document/viewdoc/?id=696
      

  2.   

    我也正想看一下MSXML如何使用呢,总是看到要安装这个东东,但就是不知道如何使用,今天可好了
      

  3.   

    建议你看一下MSDN中的IXMLDOMDocument接口的帮助,很详细,关键是学会使用DOM来导航和编辑。
    通过DOM导航找到pic节点,获得IXMLDOMElement
    IXMLDOMDocument::createNode 用来创建节点或者创建某个节点的属性
    IXMLDOMElement::appendChild 用来把创建的节点附加到当前节点的子节点序列的末尾
      

  4.   

      楼上说的不错第一次写代码也用过MSXML.
    主要就是参照SDK上的东东 调用不同的对象和函数
      

  5.   

    http://topic.csdn.net/t/20030507/20/1752428.html看看,或许有点用
      

  6.   

    to lonkil :你那篇文章早看过了,msxml3.0的,源码调试都要修改很多地方才通过。很多函数都变了,不实用。
    to jameshooo and kakashi0309  :你说的这些我都懂,可是具体如何操作阿?那东西找不到好的例子。
    to ToperRay :帖子比较长,需要逐个验证。
    另谁有比较完整的例子,网上自己也搜索过一堆,没有几个实用的。拿来别人的东西自己要先验证一下,才能形成自己的东西。
      

  7.   

    麻雀虽小,五脏俱全,即使你的这个需求很简单,也得把MSXML的使用大概了解一番。其实MSDN上对XMLDOM的每个接口的每个属性和方法都提供了例子代码,有js、vb、c++三个版本的例子,好好看看吧,其实都不复杂。
      

  8.   

    那直接看MSDN上的例子代码吧,从代码来猜测用途,一般从方法或属性名称都能猜出大概功能,相信很快就能上手
      

  9.   

    msdn上的例子太老了,是3.0的,许多定义和函数都变化了
      

  10.   

    Sample 1: Parsing an XML file
    #define UNICODE#include <windows.h>
    #include <windowsx.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <io.h>
    #include <urlmon.h>
    #include <hlink.h>
    #include <dispex.h>
    #include "mshtml.h"
    #include "msxml.h"#define ASSERT(x)  if(!(x)) DebugBreak()
    #define CHECK_ERROR(cond, err) if (!(cond)) {pszErr=(err); goto done;}
    #define SAFERELEASE(p) if (p) {(p)->Release(); p = NULL;} else ;
    int _cdecl main (int argc, char **argv)
    {
        PSTR pszErr = NULL;
        IXMLDocument           *pDoc = NULL;
        IStream                *pStm = NULL;
        IPersistStreamInit     *pPSI = NULL;
        CHAR                   buf[MAX_PATH];
        CHAR                   *pszURL;    HRESULT hr;    //
        // Check usage.
        //
        if (argc != 2)
        {
            fprintf (stderr, "Usage:   %s URL\n", argv[0]);
            fprintf (stderr, "Eg %s c:\\nt\\private\\inet\\xml\\test\\channel.cdf\n", argv[0]);
            fprintf (stderr, "or %s http://ohserv/users/julianj/msnbc.cdf\n", argv[0]);
            exit (1);
        }    //
        // HACK if passed in a file name; expand if it doesn't look like a URL.
        //
        if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, argv[1], 7, "http://", 7) == CSTR_EQUAL)
        {
            pszURL = argv[1];
        }
        else
        {
            pszURL = buf;
            GetFullPathNameA(argv[1], MAX_PATH, pszURL, NULL);
        }    hr = CoInitialize(NULL);
        ASSERT(SUCCEEDED(hr));    //
        // Create an empty XML document.
        //移植到vc6,下面这句就出错
        hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
                                    IID_IXMLDocument, (void**)&pDoc);    CHECK_ERROR (pDoc, "CoCreateInstance Failed");    //
        // Synchronously create a stream on a URL.
        //
        hr = URLOpenBlockingStreamA(0, pszURL, &pStm, 0,0);    
        CHECK_ERROR(SUCCEEDED(hr) && pStm, "Couldn't open stream on URL")
        //
        // Get the IPersistStreamInit interface to the XML doc.
        //
        hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
        CHECK_ERROR(SUCCEEDED(hr), "QI for IPersistStreamInit failed");    //
        // Init the XML doc from the stream.
        //
        hr = pPSI->Load(pStm);
        //CHECK_ERROR(SUCCEEDED(hr), "Couldn't load XML doc from stream");    if(SUCCEEDED(hr))
        {
            printf("%s : XML File is well formed \r\n",argv[0]);    }
        else
        {
            // Print error information !
            IXMLError *pXMLError = NULL ;
            XML_ERROR xmle;        hr = pPSI->QueryInterface(IID_IXMLError, (void **)&pXMLError);
            CHECK_ERROR(SUCCEEDED(hr), "Couldn't get IXMLError");        ASSERT(pXMLError);        hr = pXMLError->GetErrorInfo(&xmle);
            SAFERELEASE(pXMLError);
            CHECK_ERROR(SUCCEEDED(hr), "GetErrorInfo Failed");        printf("%s :", argv[0]);
            wprintf(TEXT(" Error on line %d. Found %s while expecting %s\r\n"),
                                xmle._nLine,
                                xmle._pszFound,
                                xmle._pszExpected); 
            
            SysFreeString(xmle._pszFound);
            SysFreeString(xmle._pszExpected);
            SysFreeString(xmle._pchBuf);
        }done: // Clean up.
        //
        // Release any used interfaces.
        //
        SAFERELEASE(pPSI);
        SAFERELEASE(pStm);
        SAFERELEASE(pDoc);    if (pszErr)
            fprintf (stderr, "%s, last error %d\n", pszErr, GetLastError());
        return 0;
    }
      

  11.   

    CLSID_XMLDocument,
    CLSCTX_INPROC_SERVER, 
    IID_IXMLDocument
    都未定义。
    算了,看来指望论坛能人提供个例子的想法是错误的。能人们都指望这些技术吃饭哪。
    看书闭关中,我一定能做一个完成的例子出来。到时候再来结帖,并发布(虽然不是啥了不起的东西)。
    为啥国外有codeguru,codeproject,sourceforge这类网站,而国内这类网站却收费?
    我想这也是国内老是比人家落后的一个原因吧。
    今天比较郁闷,心情不好,有些话说重了大家见谅阿。