我自己记录的 VC 操作 XML 笔记
1. 在文件头中添加如下:
#import <msxml4.dll>
using namespace MSXML2;
2. 程序体如下:
void RanderNodeList(MSXML2::IXMLDOMNodeListPtr nodeList ,_bstr_t * retString)
{
CoInitialize(NULL);
MSXML2::IXMLDOMNamedNodeMapPtr pMap;
pMap.CreateInstance(__uuidof(MSXML2::IXMLDOMNamedNodeMap));
for(int i=0 ;i < nodeList->length ;i++)
{
//处理节点名.
if ( nodeList->item[i]->nodeName == (_bstr_t)"xml" )
{
(*retString) += "<?";
}
else
{
(*retString) += "<";
}
(*retString )+= nodeList->item[i]->nodeName ;
(*retString) += " ";
//处理节点属性.
pMap = nodeList->item[i]->attributes;
for(int j=0;j<pMap->length;j++)
{
(*retString) += " ";
(*retString) += pMap->item[j]->nodeName;
(*retString) += " = \"";
(*retString) += (_bstr_t) pMap->item[j]->nodeValue;
(*retString) += "\" ";
}
if ( nodeList->item[i]->nodeName == (_bstr_t)"xml" )
{
(*retString) += "?>\r\n";
}
else
{
(*retString) += ">";
}
//如果没有子节点,处理节点值.
if ( nodeList->item[i]->childNodes->length == 1 )
{
(*retString) += nodeList->item[i]->text;
}
//处理子节点 nodeList->item[i]->childNodes->length == 0 是声明部分
else if ( nodeList->item[i]->childNodes->length >1 )
{
(*retString) += "\r\n";
RanderNodeList(nodeList->item[i]->childNodes,retString);
}
//闭合节点.
if ( nodeList->item[i]->nodeName == (_bstr_t)"xml" )
{
}
else
{
(*retString) += "</";
(*retString) += nodeList->item[i]->nodeName ;
(*retString) += ">\r\n";
}
}
CoUninitialize();
}
主调用函数
{
CoInitialize(NULL); //初始化 COM .
IXMLDOMDocument2Ptr pxmlDoc; //定义一个 Document 变量.
MSXML2::IXMLDOMNodePtr pxmlNode; //定义一个 Node 变量.不知为什么,已经引用了命名空间,还要我再用命名空间.
MSXML2::IXMLDOMNodeListPtr pxmlNode;
_bstr_t str;
pxmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); //产生实例.查看定义可知 msxml4 中的 Document 接口的GUID描述为 DOMDocument40 .
pxmlNode.CreateInstance(__uuidof(MSXML2::IXMLDOMNode));
pxmlNode.CreateInstance(__uuidof(MSXML2::IXMLDOMNodeList));
pxmlDoc->async = VARIANT_FALSE; //默认为 VARIANT_TRUE ,不明白什么意思.
hr = pxmlDoc->load( "L:\\ProcCode\\SendFileToConfig.xml" ); //加载文件.
if ( hr == VARIANT_TRUE ) //如果成功.
{
pNodeList = pxmlDoc->childNodes ;
RanderNodeList(pNodeList,&str);
MessageBox(NULL, str ,"",0);
}
3. 操作文件的例子:
#include <fstream>
#include "string"
using namespace std;
{
std::ifstream ftext;
std::string word;
ftext.open("sendfileto.ini");
if ( !ftext )
exit (-1);
while ( ftext >> word ) // 只要不超过 sizeof
{
if ( word == "[ListRoot]" )
{
while ( ftext >> word )
{
if ( word == "" ) //去除左右空格.
{
break;
}
HTREEITEM hSub = m_ListFolder.InsertItem( word.data() );
AddFolder(word,hSub);
}
}
vItem.push_back(word); // 将单词拷贝到向量
}
ftext.close();
}
void CSendFileToDlg::AddFolder(std::string FilePath,HTREEITEM hItem)
{
CFileFind ff;
HTREEITEM subItem;
BOOL isOK ;
FilePath.append( "\\*.*" );
if ( isOK = ff.FindFile( FilePath.data() ) )
{
while( isOK )
{
isOK = ff.FindNextFile();
if ( ff.IsDirectory() && ! ff.IsDots())
{
subItem = m_ListFolder.InsertItem(ff.GetFileName().GetBuffer(),hItem) ;
}
}
}
return;
}
|
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |

浙公网安备 33010602011771号