急问!!vc下读取xml内容

ywcyj 2002-12-18 04:05:20
我需要在vc6.0下编程,读取xml文件的内容。
例如有一个xml文件(test.xml),我需要读取身高的数据,保存在数组stature[]里。(最后stature[]数组里有170,175,168三个值即可)
应该如何写代码,高手们帮帮忙!能够提供代码最好。
先谢了!!!!
xml文件内容如下:
<?xml version="1.0" encoding="gb2312" ?>
<data>
<para>
<name>张三 </name>
<value>170</value>
<unit>cm</unit>
</para>
<para>
<name>李四 </name>
<value>175</value>
<unit>cm</unit>
</para>
<para>
<name>王五 </name>
<value>168</value>
<unit>cm</unit>
</para>
</data>
...全文
54 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywcyj 2002-12-18
  • 打赏
  • 举报
回复
谢谢,我先试试
RomanticProgrammer 2002-12-18
  • 打赏
  • 举报
回复
用dom解析...看一看xmlsdk的帮助,上面有完整的例子...
cbc 2002-12-18
  • 打赏
  • 举报
回复
直接使用Microsoft提供的接口:

1)引用dll
#import "msxml.dll" named_guids
using namespace MSXML;

2)直接包含头文件
#include "MsXML.h"

class CShowXMLDlg : public CDialog
{
//...
public:
CString m_text_filename;
IXMLDocument * m_interface_xmldoc;
public:
CTreeCtrl m_tree_xml;
void AnalyzeXMLElement(IXMLElement * pElement , HTREEITEM hParent = TVI_ROOT);
//...
};

void CShowXMLDlg::OnBnClickedButtonBrowse()
{
// TODO: 浏览XML文档
CFileDialog dlg(
TRUE,
_T("xml"),
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("XML文档(*.xml)|*.xml|所有文件(*.*)|*.*||"));
if(dlg.DoModal() == IDOK)
{
CString filename = dlg.GetFileName();
HRESULT hResult = CoCreateInstance(
CLSID_XMLDocument,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDocument,
(void **)&m_interface_xmldoc);
if(SUCCEEDED(hResult))
{
BSTR bstrFile = filename.AllocSysString();
hResult = m_interface_xmldoc->put_URL(bstrFile);
SysFreeString(bstrFile);
if(SUCCEEDED(hResult))
{
IXMLElement * pRoot = NULL;
hResult = m_interface_xmldoc->get_root&pRoot);
if(SUCCEEDED(hResult))
{
AnalyzeXMLElement(pRoot);
}
}
}

}

// 遍历元素
vid CShowXMLDlg::AnalyzeXMLElement(IXMLElement * pElement , HREEITEM hParent)
{
ASSERT(pElement);
BSTR bstrName;
HRESULT hResult;

hResult = pElement->get_tagName(&bstrName);
if(SUCCEEDED(hResult))
{
CString name = bstrName;
HTREEITEM hItem = m_tree_xml.InsertItem(name, hParent);
SysFreeString(bstrName);

IXMLElementCollection * pChilds = NULL;
hResult = pElement->get_children(&pChilds);

if(SUCCEEDED(hResult) && pChilds)
{
long count = 0;
pChilds->get_length(&count);

for(long a = 0;a < count;a ++)
{
COleVariant vIndex(a), vName;
IXMLElement * pChild = NULL;
hResult = pChilds->item(vIndex, vName, (IDispatch **)&pChild);
if(SUCCEEDED(hResult))
{
long type = 0;
pChild->get_type(&type);
if(type == XMLELEMTYPE_ELEMENT)
{
AnalyzeXMLElement(pChild, hItem);
}
}
}
}
}
}
cbc 2002-12-18
  • 打赏
  • 举报
回复
//这里有个例子

#include <wchar.h>
#import "msxml.dll"
using namespace MSXML;

void SwitchLanguage(HWND hWnd,int nDlgID)
{
HKEY hKey;
TCHAR szFileName[MAX_PATH];
if(RegOpenKeyEx(HKEY_CURRENT_USER,_TEXT("SOFTWARE\\Internet Explorer Assistant"),NULL,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS){

TCHAR szLang[MAX_LENGTH];

DWORD dwType=REG_SZ;
DWORD dwData=MAX_LENGTH;
HRESULT hr=RegQueryValueEx(hKey,_T("Language"),0,&dwType,(BYTE*)szLang,&dwData);

RegCloseKey(hKey);
if(hr!=ERROR_SUCCESS||lstrlen(szLang)==0)strcpy(szLang,"English");
strcpy(szFileName,g_szAppPath);
lstrcat(szFileName,"Language\\");
lstrcat(szFileName,szLang);
lstrcat(szFileName,".xml");

USES_CONVERSION;
IXMLDOMDocumentPtr spXMLDOM(__uuidof(DOMDocument));
try{

spXMLDOM->put_async(VARIANT_FALSE);

// HRESULT hr=spXMLDOM->CoCreateInstance("Microsoft.XMLDOM");
// spXMLDOM=spXmlNodePtr;
VARIANT_BOOL bSuccess=false;
bSuccess=spXMLDOM->load(CComVariant(szFileName));


if(!bSuccess)throw "Can not load XML,Error ocured";
IXMLDOMNodeListPtr spDOMNodeList=spXMLDOM->getElementsByTagName(_bstr_t("DIALOG"));

IXMLDOMNodePtr NextNode;
int nDlgCount=spDOMNodeList->Getlength();
CHAR szDlgID[20];
wsprintf(szDlgID,"%d",nDlgID);
for(int i=0;i<nDlgCount;i++){
NextNode=spDOMNodeList->Getitem(i);
IXMLDOMNamedNodeMapPtr pXMLDOMNamedNodeMap=NextNode->Getattributes();
IXMLDOMNodePtr pXMLDOMNodePtr2=pXMLDOMNamedNodeMap->getNamedItem(_bstr_t("ID"));
_bstr_t szID=pXMLDOMNodePtr2->GetnodeValue();

if(stristrA(OLE2CT(szID),szDlgID)!=NULL){
pXMLDOMNodePtr2=pXMLDOMNamedNodeMap->getNamedItem(_bstr_t("Caption"));
_bstr_t szCaption=pXMLDOMNodePtr2->GetnodeValue();
SetWindowText(hWnd,OLE2CT(szCaption));

}

}
////////////////////////
spDOMNodeList=spXMLDOM->getElementsByTagName(_bstr_t("CTRL"));


nDlgCount=spDOMNodeList->Getlength();

wsprintf(szDlgID,"%d",nDlgID);
for( i=0;i<nDlgCount;i++){
NextNode=spDOMNodeList->Getitem(i);
IXMLDOMNamedNodeMapPtr pXMLDOMNamedNodeMap=NextNode->Getattributes();
IXMLDOMNodePtr pXMLDOMNodePtr2=pXMLDOMNamedNodeMap->getNamedItem(_bstr_t("GROUP"));
_bstr_t szGroup=pXMLDOMNodePtr2->GetnodeValue();

if(stristrA(OLE2CT(szGroup),szDlgID)!=NULL){
pXMLDOMNodePtr2=pXMLDOMNamedNodeMap->getNamedItem(_bstr_t("Caption"));
_bstr_t szCaption=pXMLDOMNodePtr2->GetnodeValue();
pXMLDOMNodePtr2=pXMLDOMNamedNodeMap->getNamedItem(_bstr_t("NO"));
_bstr_t szCtrlID=pXMLDOMNodePtr2->GetnodeValue();
SetDlgItemText(hWnd,_wtoi(szCtrlID),OLE2CT(szCaption));
}

}
/////////////////////

}
catch(char * lpErr){
::MessageBox(NULL,lpErr,"Parse XML Error",MB_OK|MB_ICONEXCLAMATION);


}
}
}

ywcyj 2002-12-18
  • 打赏
  • 举报
回复
各位高手,我也知道用msxml本身并不难
但对于我这个第一次接触xml的人来说,就不一样了
大家给我提供一点代码作为例子吧
醉马不肖 2002-12-18
  • 打赏
  • 举报
回复
用msxml很容易,去google搜
foxmail 2002-12-18
  • 打赏
  • 举报
回复
http://www.codeproject.com/soap/markupclass.asp

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧