我的XML的格式如下:<root>
  <message>
    <date><![CDATA[2004-9-7]]></date>
    <time><![CDATA[10:10:20]]></time>
    <from><![CDATA[432323]]></from>
    <to><![CDATA[3123]]></to>
    <text><![CDATA[ffdqerewrwqfaeqd]]></text>
  </message>
</root>我现在想在root下添加一个message结点,但对XML不熟。想请问各位应该如何做。我用的是MSXML2;
最好能给一段代码。
多谢了。

解决方案 »

  1.   

    我们建立一个xml文件,内容如图所示:
     
    一,建立一个基于对话框的程序,工程名为xml;
    二, 初始化OLE.
    BOOL CXmlApp::InitInstance()
    {
    AfxOleInit();
    …….
    }三, 在对话框中增加一个按钮,ID为IDC_CREATE,我们在这个按钮的响应函数中生成一个xml文件.
    void CXmlDlg::OnCreate() 
    {
    MSXML2::IXMLDOMDocumentPtr pDoc; 
    MSXML2::IXMLDOMElementPtr  xmlRoot ;
    //创建DOMDocument对象
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
    if(!SUCCEEDED(hr)) 

    MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 


    //根节点的名称为china
    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");
    }
    不要忘了#import "msxml4.dll" //引入类型库四, 再增加一个按钮,ID为IDC_GET,在这个按钮的响应函数中读取xml文件.
    void CXmlDlg::OnGet() 
    {
    //创建DOMDocument对象
    MSXML2::IXMLDOMDocumentPtr pDoc; 
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
    if(!SUCCEEDED(hr)) 

    MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 

    //加载文件
    pDoc->load("f:\\he.xml");

    //在树中查找名为City的节点,"//"表示在任意一层查找
    MSXML2::IXMLDOMElementPtr  childNode ;
    childNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//City"));

    //得到节点类型
    MSXML2::DOMNodeType nodeType;
    childNode->get_nodeType(&nodeType);

    //节点名称
    BSTR var;
    CString name;
    childNode->get_nodeName(&var);
    name = (char*)(_bstr_t)var;

    //节点值
    VARIANT varVal;
    childNode->get_nodeTypedValue(&varVal);
    CString strValue = (char*)(_bstr_t)varVal;

    //节点属性,放在链表中
    MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
    MSXML2::IXMLDOMNodePtr pAttrItem;
    childNode->get_attributes(&pAttrs);
    long nCount ;
    pAttrs->get_length(&nCount);
    for(int i = 0 ; i < nCount ; i++)
    {
    pAttrs->get_item(i,&pAttrItem);
    //我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
    //也可以直接得到
    CString strAttrName   = (char*)(_bstr_t)pAttrItem->nodeName;
    CString strAttrValue  = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
    }
    }
      

  2.   

    我给你个写好的基于MSXML4的DOM方式XML读写类吧,配有详细说明,我的邮件[email protected]
      

  3.   

    http://search.csdn.net/Expert/topic/2525/2525788.xml?temp=.5421411
      

  4.   

    我照楼上的写了一段代码,但是添加的结点格式是:
    <message date="10:53" time="2004-10-12 10:39" from="1002" to="8888" text="42453"/>
    怎么才能保存成下面这种样式呢?
    <message>
        <date><![CDATA[2004-9-7]]></date>
        <time><![CDATA[10:10:20]]></time>
        <from><![CDATA[432323]]></from>
        <to><![CDATA[3123]]></to>
        <text><![CDATA[ffdqerewrwqfaeqd]]></text>
      </message>我的代码如下:
    _variant_t varXml(MsgXml);
    pDoc->load(varXml);MSXML2::IXMLDOMElementPtr rootnode,pChildNode;rootnode=(MSXML2::IXMLDOMElementPtr) pDoc->selectSingleNode("//root");
    if ( rootnode == NULL )
    return ;
    pDoc->raw_createElement((_bstr_t)(char*)"message", &pChildNode);
    pChildNode->setAttribute("date",(_bstr_t)(_T("2004-9-7")));
    pChildNode->setAttribute("time",(_bstr_t)(_T("10:10:24");
    pChildNode->setAttribute("from",(_bstr_t)(_T("dfas");
    pChildNode->setAttribute("to",(_bstr_t)(_T("faaf");
    pChildNode->setAttribute("text",(_bstr_t)(_T("whow dka");
    rootnode->appendChild(pChildNode);
    pDoc->save(varXml);
      

  5.   

    需要添加节点都是由XMLDocument创建出来,再由子节点插入的,如 MSXML::IXMLDOMDocumentPtr pDoc;
     MSXML::IXMLDOMElementPtr pElem = NULL;
     pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
     pDoc->loadXML(_bstr_t("<test>hello</test>"));
     pElem = pDoc->GetdocumentElement();
     if(pElem!=NULL)
     {
      _bstr_t tmp = pElem->Getxml();
      pElement->appendChild((MSXML::IXMLDOMNodePtr)pElem);//发现没有,这样也行
     }
     pDoc.Release();
     pDoc=NULL;
      

  6.   

    http://www.codeguru.com/Cpp/controls/editctrl/article.php/c539/http://www.vchelp.net/vchelp/archive.asp?type_id=76&class_id=1&cata_id=5&article_id=820&search_term=http://www.vchelp.net/vchelp/archive.asp?type_id=76&class_id=1&cata_id=5&article_id=293&search_term=
      

  7.   

    还有一个问题就是怎么让存的结点的值是<![CDATA[432323]]>,带CDATA的呢.
    XmlStr = "<![CDATA[ "+ m_strFrom +" ]]>";
    这样不对.应该怎么改呢.
      

  8.   

    保存的结果是:
    将"<![CDATA[ "中的<全存成了&gt;,请问应该如何改才对呢.
      

  9.   

    不对,应该使用IXMLDOMCDATASection建立
      

  10.   

    你直接赋字符串,解析器会以为是赋这样的值而不是添加CDATASection
      

  11.   

    可以用((MSXML2::IXMLDOMNode *)pTmpNode)->dataType=NODE_CDATA_SECTION;吗?