我用vc对xml编程,
void CXmlDlg::OnGet() 
{
         MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
//根节点的名称为china
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!");
pDoc->raw_createElement((_bstr_t)(char*)"china",&xmlRoot);
pDoc->raw_appendChild(xmlRoot,NULL);

MSXML2::IXMLDOMElementPtr childNode;
pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("WuHan");//节点值
childNode->setAttribute("population","8,000,000");//属性名,属性值 childNode->setAttribute("area","10000");
xmlRoot->appendChild(childNode);

pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("ShangHai");
childNode->setAttribute("population","12,000,000");
childNode->setAttribute("area","12000");
xmlRoot->appendChild(childNode); //保存到文件
//如果不存在就建立,存在就覆盖
pDoc->save("f:\\he.xml");
}
    }
}运行后,老是提示"无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!"我下载了一个msxml4.0后,仍然提示以上错误。请问,这个“ms xml parser运行库”怎样安装?放在那个目录下??

解决方案 »

  1.   

    好像需要倒入库才有用
    记不清了好像是
    #import xxxxml.dll
      

  2.   

    问题1:
    如果你下载并安装了msxml4.0,则在调用的时候要用CLSID_DOMDocument40,而不是30。
    //创建COM对象实例
    hrErr = CoCreateInstance(CLSID_DOMDocument40,
    NULL,
    CLSCTX_INPROC_SERVER, 
    IID_IXMLDOMDocument2,
    (void**)&pXMLDOMDoc);

    if (hrErr == S_OK)
    //如果COM对象实例创建成功
    {.....
             }问题2:
    在调用XML解析之前,你需要对COM进行初始化,并在程序结束时进行反初始化:
    //初始化
    HRESULT hr;
    hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
    AfxMessageBox("出现意外,请与开发工程师联系 :(");
    //exit(hr);
    } //反初始化:
    CoUninitialize();
      

  3.   

    请大虾们写一个完整的对xml读写的程序吧。希望有详细的步骤!!
    谢谢了。
      

  4.   

    我这儿有一个访问xml的类 
    头文件如下:
    // XMLEngine.h: interface for the CXMLEngine class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_)
    #define AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#include "stdio.h"
    #import "msxml3.dll"
    using namespace MSXML2;inline void EVAL_HR( HRESULT _hr )    { if FAILED(_hr) throw(_hr); }class CXMLEngine  
    {
    public:
    CXMLEngine();
    virtual ~CXMLEngine(); public:
    IXMLDOMDocumentPtr objDOMDoc;
    BSTR mXML;
    public: int CXMLEngine::Initialize(char *sFileName);
    IXMLDOMNodePtr GetNode(BSTR sKey);
    HRESULT DeleteNode(BSTR sKey);
    VARIANT GetAttribute(IXMLDOMNodePtr oNode,char *sKey);
    HRESULT SaveXML_To_File(char *filename);
    HRESULT AddNode(char *sParent_Key, char *sKey, char *sElementInformation);
    //HRESULT SetAttribute(IXMLDOMElement *oNode,char *sAttributeName, char *sAttributeValue);
    void Refresh();};#endif // !defined(AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_)实现文件如下:// XMLEngine.cpp: implementation of the CXMLEngine class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "SLNRel.h"
    #include "XMLEngine.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////#define RELEASE(pInterface)\
    {\
    pInterface->Release();\
    pInterface=NULL;\
    }\CXMLEngine::CXMLEngine()
    {
    }
    CXMLEngine::~CXMLEngine()
    {
    }
    int CXMLEngine::Initialize(char *sFileName)
    {
    char searchPath[200];
    try 
       {
    EVAL_HR(CoInitialize(NULL)); 
    //EVAL_HR(objDOMDoc.CreateInstance("Msxml2.DOMDocument.3.0"));
    EVAL_HR(objDOMDoc.CreateInstance("microsoft.xmldom"));

    // GetCurrentDirectory(200, searchPath);
    // strcat(searchPath,"\\");
    // strcat(searchPath,sFileName); _variant_t varXml(sFileName);
    _variant_t varOut((bool)TRUE); objDOMDoc->async = false;
    varOut = objDOMDoc->load(varXml); mXML=objDOMDoc->xml;
    // AfxMessageBox(objDOMDoc->xml);//mXML); if ((bool)varOut == FALSE)
     throw(0);

    return 0;
    }

    catch(...)
    {
    AfxMessageBox("Exception occurred");
    return -1;
    } CoUninitialize();   
    }
    IXMLDOMNodePtr CXMLEngine::GetNode(BSTR sKey)
    {
    /*
    Purpose:locate a specific node in the
    xml structure by its "key" value
    */
    CString sCriteria;    IXMLDOMNodePtr oNode;    sCriteria = "//node[@key $eq$ '";
    sCriteria += sKey;
    sCriteria += "']"; oNode=objDOMDoc->selectSingleNode(_bstr_t(sCriteria));    if (oNode!=NULL)
    {
            return(oNode);
    }
    else
    {
    AfxMessageBox("Node Not Found");
    return(NULL);
    }
    }
    HRESULT CXMLEngine::DeleteNode(BSTR sKey)
    {
    /*
    'Purpose: remove a node from the xml tree
    '1)Find the node
    '2)Find the node's parent
    '3)Invoke the parents removeChild method deleting
    'the node and its descendants from the xml tree.
    */
        IXMLDOMNodePtr oNode;
        IXMLDOMNodePtr oParentNode;
        VARIANT sParent_Key;    oNode = GetNode(sKey);    if(oNode != NULL)
    {
    sParent_Key=GetAttribute(oNode,"parent_key"); //AfxMessageBox(_bstr_t(sParent_Key));
            oParentNode = GetNode(_bstr_t(sParent_Key));        if (oParentNode != NULL)
    {
                oParentNode->removeChild(oNode);
    }
    }
    else
    {
    return(E_FAIL);
    }
    return(S_OK);
    }VARIANT CXMLEngine::GetAttribute(IXMLDOMNodePtr oNode,char *sKey)
    {
    IXMLDOMNodePtr oAttribute;
    IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;
    VARIANT sReturn_Key; DOMNamedNodeMapPtr = oNode->attributes; oAttribute=DOMNamedNodeMapPtr->getNamedItem(_bstr_t(sKey));
    oAttribute->get_nodeValue(&sReturn_Key); return(sReturn_Key);
    }
    HRESULT CXMLEngine::SaveXML_To_File(char *sFilename)
    {
    char sSaveFile[200]; GetCurrentDirectory(200, sSaveFile);
    strcat(sSaveFile,"\\");
    strcat(sSaveFile,sFilename); objDOMDoc->save(sSaveFile); return(S_OK);
    }
    HRESULT CXMLEngine::AddNode(char *sParent_Key, char *sKey, char *sElementInformation)
    {
    /*
    Purpose: Add a node to the xml tree
    1)Search for the parent node
    2)Assign attribute values to the new node
    3)Insert the new node into the xml tree
    */
        //IXMLDOMNodePtr oNewNode;
    IXMLDOMElementPtr oElementNode;
        IXMLDOMNodePtr oParentNode, oProposedNode;
    CString sCriteria;
        HRESULT hr; //1-Check if the Node already exists
        sCriteria = "//node[@key $eq$ '";
    sCriteria += sKey;
    sCriteria += "']";    oProposedNode = objDOMDoc->selectSingleNode(_bstr_t(sCriteria));
    if (oProposedNode!=NULL)
    {
    return (E_FAIL);
    }    //2-Search for Parent Node Match
        sCriteria = "//node[@key $eq$ '";
    sCriteria += sParent_Key;
    sCriteria += "']";    oParentNode = objDOMDoc->selectSingleNode(_bstr_t(sCriteria));
        
        //3-Insert new Node into Document Object Model (dom) structure    if (oParentNode != NULL) 
    {
        //oNewNode = objDOMDoc->createElement("node");
    oElementNode=objDOMDoc->createElement("node");
    hr=oElementNode->setAttribute(_bstr_t("parent_key"),_bstr_t(sParent_Key));
    hr=oElementNode->setAttribute(_bstr_t("key"),_bstr_t(sKey));
      hr=oElementNode->setAttribute(_bstr_t("element_inforamtion"),_bstr_t(sElementInformation));
    oParentNode->appendChild(oElementNode);
        }
    else
    {
    return(E_FAIL);
    }
    return(S_OK);
    }
    /*
    HRESULT CXMLEngine::SetAttribute(IXMLDOMElement *oNode,char *sAttributeName, char *sAttributeValue)
    {
    HRESULT hr;
    IXMLDOMAttribute *oAttribute;
    IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;


    oAttribute=objDOMDoc->createAttribute(_bstr_t(sAttributeName)); if (!oAttribute)
    {
    AfxMessageBox("Unable to create attribute");
    return(E_FAIL);
    }
    oAttribute->put_value(_variant_t(sAttributeValue)); DOMNamedNodeMapPtr = oNode->attributes; hr=DOMNamedNodeMapPtr->setNamedItem(oAttribute); if(SUCCEEDED(hr) && oAttribute)
    { } return(S_OK);
    }
    */
    void CXMLEngine::Refresh()
    {
    mXML=objDOMDoc->xml;
    }
      

  5.   

    在MS网站上下载msxml3chs.msi,安装后就万事大吉。
      

  6.   

    想设置属性为int的1怎么设置啊?
      

  7.   

    老兄,你调用的是3。0的XML COM装4。0当然没用哪
      

  8.   

    实例代码:
    link 里面添加:msxml2.lib#include "msxml2.h"try
    {
    HRESULT hr;
    IXMLDOMDocument* pXMLDoc;
    IXMLDOMNode* pXDN;

    //COM的初始化 
    hr=CoInitialize(NULL);
        
    //得到关于IXMLDOMDocument接口的指针pXMLDOC
    hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,
     IID_IXMLDOMDocument,(void**) &pXMLDoc); 
        
    //将XML字符串转换成UNICODE,然后加载
    VARIANT_BOOL bSuccess = false;
    pXMLDoc->loadXML(L"<?xml version=\"1.0\" encoding=\"GB2312\"?><root><file><time>2003-10-13</time><content>内容</content><title>标题</title></file></root>",&bSuccess);

    //得到已加载的XML字符串,并显示
    LPWCH tempxml;

    //因为此处是输出参数[out][retval],所以不用new一段空间
    pXMLDoc->get_xml(&tempxml);
    MessageBoxW(NULL,tempxml,L"XML正文",MB_OK);

    //取到<time>,<title>以及<content>节点,并显示结点内容
    pXMLDoc->selectSingleNode(L"//time",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"time值",MB_OK);
    pXMLDoc->selectSingleNode(L"//title",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"title值",MB_OK);
    pXMLDoc->selectSingleNode(L"//content",(IXMLDOMNode **)&pXDN);
    pXDN->get_text(&tempxml);
    MessageBoxW(NULL,tempxml,L"content值",MB_OK); //释放分配的资源

    CoUninitialize();
    }
    catch(...)
    {
    AfxMessageBox("错误!");
    }