我现在碰到一个难题,需要把vc中的一个类的数据跟xml文件关联起来
(功能类似.net下的xml序列化过程和反序列化)现在可以把类中的数据
写到文件中。但不知道怎么把数据从xml文件中读到程序里中去!
各位打下帮帮忙?急!

解决方案 »

  1.   

    打开 xml 文件
    ::CoInitialize(NULL);
    HRESULT hr = m_plDomDocument.CreateInstance(CLSID_DOMDocument);
    if (FAILED(hr))
    {
     _com_error er(hr);
     AfxMessageBox(er.ErrorMessage());
     //EndDialog(1);
    } CString strFileName (xmlFile);
    _bstr_t bstrFileName;
    bstrFileName = strFileName.AllocSysString(); // call the IXMLDOMDocumentPtr's load function to load the XML document
    variant_t vResult;
    vResult = m_plDomDocument->load(bstrFileName);
    if (((bool)vResult) == TRUE) // success!
    {
    // now that the document is loaded, we need to initialize the root pointer
    m_pDocRoot = m_plDomDocument->documentElement;
    }
    else
    {
    AfxMessageBox("Document FAILED to load!");
    }
      

  2.   

    <sqlPrefix> SELECT sum(amount) as cellNum FROM t_inInvoice  WHERE 1=1 </sqlPrefix>//得到 sqlPrefix 的值
    m_pDocRoot->raw_selectNodes(_bstr_t("sqlPrefix"),&resultList);
    resultList->get_item(0,&pIDOMNode);
    if( pIDOMNode ){
    pIDOMNode->get_text(&bstrItemText);
    this->sqlPrefix = CString(bstrItemText);
    }
    pIDOMNode->Release();
    pIDOMNode = NULL;
      

  3.   

    <mainlist_field>
    <field>
      <source>select typeName as _listName from t_inInvoice group by typeName</source>
      <rule></rule>
      <name>t_inInvoice.typeName</name>
      <type>string</type>
      <description>类型</description>
    </field>
    <field>
      <source>select goodsName as _listName from t_inInvoice group by goodsName</source>
      <rule></rule>
      <name>t_inInvoice.goodsName</name>
      <type>string</type>
      <description>货物名称</description>
    </field>
    </mainlist_field>
    //得到 field 的值
    m_pDocRoot->raw_selectNodes(_bstr_t("\/\/field"),&resultList);
    for(int i=0; i<resultList->Getlength();i++){
    resultList->get_item(i,&pIDOMNode);
    if( pIDOMNode ){



    //得到name
    pIDOMNode->raw_selectNodes(_bstr_t("name"),&subList);
    subList->get_item(0,&subNode);
    subNode->get_text(&bstrItemText);
    name = CString(bstrItemText);
    subNode->Release();
    subNode = NULL;

    //得到type
    pIDOMNode->raw_selectNodes(_bstr_t("type"),&subList);
    subList->get_item(0,&subNode);
    subNode->get_text(&bstrItemText);
    type = CString(bstrItemText);
    subNode->Release();
    subNode = NULL;

    //得到desctiption
    pIDOMNode->raw_selectNodes(_bstr_t("description"),&subList);
    subList->get_item(0,&subNode);
    subNode->get_text(&bstrItemText);
    description = CString(bstrItemText);
    subNode->Release();
    subNode = NULL; //得到source
    pIDOMNode->raw_selectNodes(_bstr_t("source"),&subList);
    subList->get_item(0,&subNode);
    subNode->get_text(&bstrItemText);
    source = CString(bstrItemText);
    subNode->Release();
    subNode = NULL; //得到rule
    pIDOMNode->raw_selectNodes(_bstr_t("rule"),&subList);
    subList->get_item(0,&subNode);
    subNode->get_text(&bstrItemText);
    rule = CString(bstrItemText);
    subNode->Release();
    subNode = NULL;

    field.Add(new DbField(description,type,name,source,rule));  }
            }
      

  4.   

    非常感谢这位大侠的指点   不过小弟水平太菜,不知道怎么创建一个解析器实例。还有不知道该include那些头文件。还请007多多帮忙!
    void CtestxmlDlg::OnBnClickedButton1()
    {   CString xmlFile;
        xmlFile="c:\\hcy.xml";
    ::CoInitialize (NULL );
     try {
            // 通过智能指针创建一个解析器的实例
    CComPtr m_plDomDocument;
    HRESULT hr =m_plDomDocument.CoCreateInstance(-uuidof(DOMDocument));//括号里有问题,请帮我看看,告诉我正确答案!
    if ( FAILED(hr) ) throw "不能创建XML Parser对象";
    if ( spXMLDOM.p == NULL ) throw  "不能创建XML Parser对象";
        hr = m_plDomDocument.CoCreateInstance(CLSID_DOMDocument);
    if (FAILED(hr))
    {。
      

  5.   

    1。
    在 StdAfx.h 中加#import <msxml.dll> named_guids
    using namespace MSXML;2。在你的主程序中 的 InitInstance() 中加
    ::AfxOleInit();就行了
      

  6.   

    我照你说的做了,怎么还不行?是不是还有其他方面需要修改的地方,
    m_plDomDocument  在哪里声明?怎么声明?我要疯了!救救我。
      

  7.   

    CComPtr m_plDomDocument;
    HRESULT hr =m_plDomDocument.CoCreateInstance(-uuidof(DOMDocument));//这语句不好时,没有_uuidof这种标识符
    还有我用的是.net下的vc7.0
     CoCreateInstance()括号里的参数是三个。
    HRESULT CoCreateInstance(
       LPCOLESTR szProgID,
       LPUNKNOWN pUnkOuter = NULL,
       DWORD dwClsContext = CLSCTX_ALL 
    ) throw( );
    HRESULT CoCreateInstance(
       REFCLSID rclsid,
       LPUNKNOWN pUnkOuter = NULL,
       DWORD dwClsContext = CLSCTX_ALL 
    ) throw( );//摘自msdnCComPtr m_plDomDocument;
    HRESULT hr =m_plDomDocument.CoCreateInstance(-uuidof(DOMDocument));//括号里有问题,请帮我看看,告诉我正确答案!
      

  8.   

    sorry!
    我是用的 vc 6.0你可以查查其他资料!
      

  9.   

    在vc6.0下这样写可以吗?
    我现在工作是维护以前的程序(使用VC6.0编的)那样我就在VC下编写也可以!
    m_plDomDocument  在哪里声明?怎么声明?救救我。
      

  10.   

    m_plDomDocument当然是你在那儿用在那儿声明了。就像一个普通的类成员一样了。
      

  11.   

    CComPtr m_plDomDocument;
    HRESULT hr =m_plDomDocument.CoCreateInstance(-uuidof(DOMDocument));//这语句不好时,没有_uuidof这种标识符是这样吗?参数好像不对。
      

  12.   

    http://www.codeproject.com/soap/paramio.asp
      

  13.   

    __uuid(DOMDocument))等价于CLSID_DOMDocument。用C++处理XML学习,学习
      

  14.   

    007
    我想可能是我缺某些东东,我现在一步来,
    1,#import <msxml.dll> named_guids
    using namespace MSXML;2,::AfxOleInit();
    没出问题!接下来我先声明一个实例,
    void CxmlfescoDlg::OnBnClickedButton1()
    {
    ::CoInitialize(NULL);

    CComPtr<IXMLDocument >   a;


    HRESULT hr =a.CoCreateInstance(CLSID_DOMDocument);
    // TODO: 在此添加控件通知处理程序代码
    编译就出错:e:\hahaxml\xmlfesco\xmlfescoDlg.cpp(146): error C2872: “CLSID_DOMDocument” : 不明确的符号
    e:\hahaxml\xmlfesco\xmlfescoDlg.cpp(143): error C2872: “IXMLDocument” : 不明确的符号
    我直接声明
        CComPtr  a;
    更有问题。
      

  15.   

    在 头文件中定义:
    IXMLDOMElementPtr m_pDocRoot;
    IXMLDOMDocumentPtr m_plDomDocument;在 cpp 中:
    ::CoInitialize(NULL);
    HRESULT hr = m_plDomDocument.CreateInstance(CLSID_DOMDocument);
    if (FAILED(hr))
    {
     _com_error er(hr);
     AfxMessageBox(er.ErrorMessage());
    }
    //AfxMessageBox("=="+xmlFile);
    CString strFileName (xmlFile); //你想要调用的xml文件名
    _bstr_t bstrFileName;
    bstrFileName = strFileName.AllocSysString();
    // call the IXMLDOMDocumentPtr's load function to load the XML document
    variant_t vResult;
    vResult = m_plDomDocument->load(bstrFileName);
    if (((bool)vResult) == TRUE) // success!
    {
    // now that the document is loaded, we need to initialize the root pointer
    m_pDocRoot = m_plDomDocument->documentElement;
    }
    else
    {
    AfxMessageBox("Document FAILED to load!");
    }
      

  16.   

    因为我的代码太乱了, 不然我发给你
    等我整理好了,到 www.51robot.com 中下载
      

  17.   

    http://codeguru.earthweb.com/xml/XMLDOMFromVC.html
      

  18.   

    非常感谢你的帮助。我也按照http://codeguru.earthweb.com/xml/XMLDOMFromVC.html
    一步步做下去。
    结果 后就出错
    e:\xmltest103\XMLDOMFromVC\XMLDOMFromVCDlg.h(23): error C2872: “IXMLDOMDocumentPtr” : 不明确的符号
    e:\xmltest103\XMLDOMFromVC\XMLDOMFromVCDlg.h(24): error C2872: “IXMLDOMElementPtr” : 不明确的
    e:\xmltest103\XMLDOMFromVC\XMLDOMFromVCDlg.cpp(103): error C2872: “CLSID_DOMDocument” : 不明确的符号这些都是msxml名称空间里的。
    另外:我是两个操作系统。98和2000,是不是import msxml.dll 时把98中c:\\windows\system的文件给导进来了,而2000的msxml.dll 在:c:winnt\\system32是这个原因吗?
    该怎么改写呢?
    我没招了!
      

  19.   

    用VC也能读XML中的内容,正是我想知道的,学习学习
      

  20.   

    你编译 http://codeguru.earthweb.com/xml/XMLDOMFromVC.html 
    的例子,可以通过吗?(如不能通过,就是你系统的问题了)另外, 如果用 CoCreateInstance  来创建 DOM 对象的话1。 在主程序的头文件中 加 
         #import "msxml4.dll" named_guids  
    (如果是 msxml4.0 以下的版本用 )  #import "msxml.dll" named_guids   2。MSXML2::IXMLDOMDocument* document = NULL;
       MSXML2::IXMLDOMParseError* parseError = NULL;
       MSXML2::IXMLDOMElement* element = NULL;
       CString strPathName = "51robot.xml";  HRESULT hr;
      hr = CoInitialize(NULL);
      if (FAILED(hr)) {
    return;
      }  hr = CoCreateInstance(MSXML2::CLSID_DOMDocument, NULL, 
    CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
    MSXML2::IID_IXMLDOMDocument, (LPVOID*)&document);
      if (!document) {
    return;
      }
      

  21.   

    还有问题 
    QQ 联系 5691656
    注名:  CSDN XML
      

  22.   

    问题得到解决,感谢007和ROBOT