首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

遍历 xml 文件,该怎么解决

2012-01-01 
遍历 xml 文件xml文件如下所示:chinaCitypopulation 11,000,000 area 11000 wuHan /CityCit

遍历 xml 文件
xml   文件如下所示   :  
<china>
<City   population= "11,000,000 "   area= "11000 "> wuHan </City>
<City   population= "12,000,000 "   area= "12000 "> shangHai </City>
<City   population= "13,000,000 "   area= "13000 "> jiNan </City>
<City   population= "14,000,000 "   area= "14000 "> beiJing </City>
</china>


VC   代码如下   :  

MSXML2::IXMLDOMDocumentPtr   pDoc;  
HRESULT   hr   =   pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))  
{                                
        MessageBox( "无法创建DOMDocument对象,请检查是否安装了MS   XML   Parser   运行库! ");
        return;
}  
//加载文件
pDoc-> load( "friends.xml ");
//在树中查找名为City的节点, "// "表示在任意一层查找
MSXML2::IXMLDOMElementPtr     childNode   ;
childNode   =   (MSXML2::IXMLDOMElementPtr)(   pDoc-> selectSingleNode(   "//City "));

//得到节点类型
MSXML2::IXMLDOMNamedNodeMapPtr   pAttrs   =   NULL;  
MSXML2::IXMLDOMNodePtr   pAttrItem;
//得到节点类型
MSXML2::DOMNodeType   nodeType;
childNode-> get_nodeType(&nodeType);
//节点名称
BSTR   var;
CString   mm_strKeyName;
childNode-> get_nodeName(&var);
mm_strKeyName   =   (char*)(_bstr_t)var;
TRACE(   "   遍历的键值   :   %s   \n ",   mm_strKeyName);
VARIANT   varVal;
childNode-> get_nodeTypedValue(&varVal);
CString   strValue   =   (char*)(_bstr_t)varVal;
TRACE(   "   城市名称   :   %s   \n ",   strValue);
//节点属性,放在链表中
childNode-> get_attributes(&pAttrs);
long   nCount;
pAttrs-> get_length(&nCount);
for(int   i   =   0   ;   i   <   nCount   ;   i++)
{
        pAttrs-> get_item(i,&pAttrItem);
        CString   strAttrName       =   (char*)(_bstr_t)pAttrItem-> nodeName;
        CString   strAttrValue     =   (char*)(_bstr_t)pAttrItem-> nodeTypedValue;
        TRACE(   "   ====   %s   ,   %s   \n ",   strAttrName,   strAttrValue);
}

以上代码只能打印出   wuhan   的信息
我修改了   老半天了   没法子   闷啊  
在这个基础上如何   把   xml   文件的   地区和他的属性遍历出来啊   ?

谢谢   !



[解决办法]
你那种方法想的太简单了,这是我以前写的一个函数,你需要就给你,第一个参数把根节点传进去即可。
int cout_data(IXMLDOMNodePtr node,int level)
{
IXMLDOMNamedNodeMapPtr pAttr;
IXMLDOMNodePtr pNode,PNode;
IXMLDOMNodeListPtr pNodeList;
int b=level;
b++;
for(int a=level;a> 0;a--)
{
cout < < " ";
}
cout < <node-> nodeName < < " ";
pNodeList=node-> childNodes;
while(PNode=pNodeList-> nextNode())
{
if(PNode-> nodeType==NODE_TEXT)
cout < < " " < <((_bstr_t)PNode-> text) < < " ";

}
node-> get_attributes(&pAttr);


for(int cnt = 0 ; (pNode = pAttr-> nextNode()) ; ++cnt)
{
cout < < (char*)pNode-> baseName < < ": " < < (char*)((_bstr_t)pNode-> text) < < " ";
}
cout < <endl;
pNodeList=node-> childNodes;
while(PNode = pNodeList-> nextNode())
{
if(PNode-> nodeType==NODE_TEXT||PNode-> nodeType==NODE_COMMENT||PNode-> nodeType==NODE_CDATA_SECTION)
continue;
else cout_data(PNode,b);
}

return 1;
}

热点排行