IXMLDOMDocumentPtr pDoc; IXMLDOMNodePtr pXmlInstruction; HRESULT hr = pDoc.CreateInstance("Microsoft.XMLDOM"); CComVariant vFileName("ReadXML.xml"); CComVariant cComVari; VARIANT_BOOL vb; hr = pDoc->load(vFileName,&vb); BSTR bstrInfo; BSTR bstrInfo2; VARIANT vInfo; //文档节点 pDoc->get_nodeName(&bstrInfo); //#document SysFreeString(bstrInfo); pDoc->get_nodeValue(&vInfo); //NULL //第一个节点都是通过 document 的 get_firstChild 来获取 hr = pDoc->get_firstChild(&pXmlInstruction); #if 0 //<?xml version="1.0" encoding="gb2312"?> pXmlInstruction->get_nodeName(&bstrInfo); //xml SysFreeString(bstrInfo); pXmlInstruction->get_nodeValue(&vInfo); //version="1.0" encoding="gb2312" pXmlInstruction->get_text(&bstrInfo); //version="1.0" encoding="gb2312" SysFreeString(bstrInfo); pXmlInstruction->get_dataType(&vInfo); //null pXmlInstruction->get_nodeTypeString(&bstrInfo);//processinginstruction SysFreeString(bstrInfo); #endif IXMLDOMNodePtr pComment1; pXmlInstruction->get_nextSibling(&pComment1); #if 0 //注释操作 //<!-- Copyright w3school.com.cn --> pComment1->get_nodeName(&bstrInfo); //#comment SysFreeString(bstrInfo); pComment1->get_nodeValue(&vInfo); // Copyright w3school.com.cn pComment1->get_text(&bstrInfo); // Copyright w3school.com.cn SysFreeString(bstrInfo); pComment1->get_nodeTypeString(&bstrInfo); //comment SysFreeString(bstrInfo); //cComVari = "注释修改"; //pComment1->put_nodeValue(cComVari); //ok bstrInfo = _com_util::ConvertStringToBSTR("注释修改123456"); pComment1->put_text(bstrInfo); SysFreeString(bstrInfo); #endif IXMLDOMNodePtr pStoreNode; #if 0 //storelist节点 IXMLDOMNodeListPtr pStoreList; bstrInfo = _com_util::ConvertStringToBSTR("bookstore"); hr = pDoc->getElementsByTagName(bstrInfo,&pStoreList); SysFreeString(bstrInfo); long lCount; hr = pStoreList->get_length(&lCount); //1 IXMLDOMNodePtr pNextNode; hr = pStoreList->get_item(0,&pNextNode); pNextNode->get_nodeName(&bstrInfo); //bookstore pNextNode->get_nodeValue(&vInfo); //null //所有文本:Harry Potter J K. Rowling 2005 29.99 //Everyday Italian Giada De Laurentiis 2005 30.00 //Learning XML Erik T. Ray 2003 39.95 //XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 pNextNode->get_text(&bstrInfo2); SysFreeString(bstrInfo); SysFreeString(bstrInfo2); #endif #if 0 //通过 getElementsByTagName 来访问元素 IXMLDOMNodeListPtr pTitleList; bstrInfo = _com_util::ConvertStringToBSTR("title"); hr = pDoc->getElementsByTagName(bstrInfo,&pTitleList); SysFreeString(bstrInfo); long lCount; hr = pTitleList->get_length(&lCount); //4 IXMLDOMNodePtr pListElement; for(long lLoop = 0; lLoop < lCount; lLoop++) { pTitleList->get_item(lLoop,&pListElement); //访问属性 IXMLDOMNamedNodeMapPtr pAttriNodeMap; long lAttriListLength; pListElement->get_attributes(&pAttriNodeMap); pAttriNodeMap->get_length(&lAttriListLength);//[0]:1 for(long lAttriLoop = 0; lAttriLoop < lAttriListLength; lAttriLoop++) { IXMLDOMNodePtr pNode; pAttriNodeMap->get_item(lAttriLoop,&pNode); pNode->get_nodeName(&bstrInfo);//[0]:lang1 [1]:lang2 [2]:lang3 [3]:lang4 pNode->get_nodeValue(&vInfo);//[0]:en1 [1]:en2 [2]:en3 [3]:en4 pNode->get_text(&bstrInfo2);//[0]:en1 [1]:en2 [2]:en3 [3]:en4 SysFreeString(bstrInfo); SysFreeString(bstrInfo2); pNode->get_nodeTypeString(&bstrInfo);//[0]:attribute SysFreeString(bstrInfo); } pListElement->get_nodeValue(&vInfo);//null pListElement->get_text(&bstrInfo);//[0]:Harry Potter [1]:Everyday Italian [2]:Learning XML [3]:XQuery Kick Start pListElement->get_nodeTypeString(&bstrInfo2);//element SysFreeString(bstrInfo); SysFreeString(bstrInfo2); } #endif #if 0//修改节点 IXMLDOMNodeListPtr pAuthorList; bstrInfo = _com_util::ConvertStringToBSTR("author"); pDoc->getElementsByTagName(bstrInfo,&pAuthorList); SysFreeString(bstrInfo); long lAuthorNumber; pAuthorList->get_length(&lAuthorNumber); IXMLDOMNodePtr pAuthorNode; pAuthorList->get_item(lAuthorNumber - 1,&pAuthorNode); #if 1 //通过 pAuthorNode 和 pChildOfAuthor 都可以成功修改 author 内容 //pAuthorNode 是元素节点 pChildOfAuthor则是文本节点 pAuthorNode->get_nodeName(&bstrInfo2);//author pAuthorNode->get_nodeTypeString(&bstrInfo);//element pAuthorNode->get_nodeValue(&vInfo);//null SysFreeString(bstrInfo); SysFreeString(bstrInfo2); bstrInfo = _com_util::ConvertStringToBSTR("test"); pAuthorNode->put_text(bstrInfo); //可以成功修改 SysFreeString(bstrInfo); #else IXMLDOMNodePtr pChildOfAuthor; pAuthorNode->get_firstChild(&pChildOfAuthor); pChildOfAuthor->get_nodeName(&bstrInfo2);//#text pChildOfAuthor->get_nodeTypeString(&bstrInfo);//text pChildOfAuthor->get_nodeValue(&vInfo);//Vaidyanathan Nagarajan SysFreeString(bstrInfo); SysFreeString(bstrInfo2); bstrInfo = _com_util::ConvertStringToBSTR("shenzhen"); pChildOfAuthor->put_text(bstrInfo); SysFreeString(bstrInfo); #endif #endif #if 1//修改属性 IXMLDOMNodeListPtr pBookList; bstrInfo = _com_util::ConvertStringToBSTR("book"); pDoc->getElementsByTagName(bstrInfo,&pBookList); SysFreeString(bstrInfo); long lBookNum; pBookList->get_length(&lBookNum); for(long lLoop = 0; lLoop < lBookNum; lLoop++) { IXMLDOMNodePtr pBookNode; pBookList->get_item(lLoop,&pBookNode); IXMLDOMNamedNodeMapPtr pAttriMap; pBookNode->get_attributes(&pAttriMap); long lAttriNum; pAttriMap->get_length(&lAttriNum); for(long lAttriLoop = 0; lAttriLoop < lAttriNum; lAttriLoop++) { IXMLDOMNodePtr pElementOfAttriMap; pAttriMap->get_item(lAttriLoop,&pElementOfAttriMap); pElementOfAttriMap->get_nodeName(&bstrInfo); SysFreeString(bstrInfo); hr = pElementOfAttriMap->get_nodeValue(&vInfo); char *pszAttri = _com_util::ConvertBSTRToString(vInfo.bstrVal); CString strAttri(pszAttri); strAttri += "'s book"; vInfo.bstrVal = strAttri.AllocSysString(); delete []pszAttri; hr = pElementOfAttriMap->put_nodeValue(vInfo); } //IXMLDOMNodePtr pChildOfBook; //pBookNode->get_firstChild(&pChildOfBook);//获取到title子节点,与要获取的属性不符 //pChildOfBook->get_nodeName(&bstrInfo);//获取到title子节点,与要获取的属性不符 //SysFreeString(bstrInfo); } #endif cComVari = "D:\\Other\\XX_学习资料\\IT\\MSXML\\new.xml"; pDoc->save(cComVari);
对应xml:
<?xml version="1.0" encoding="gb2312"?> <!-- Copyright w3school.com.cn --> <bookstore> <book category="children"> <title lang1="en1">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang2="en2">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web" cover="paperback"> <title lang3="en3">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang4="en4">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> </bookstore>