遍历 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;
}