收到JAVA程序发过来的一串XML,
VC++中有什么可以解析xml的?非常感谢!!!!
VC++中有什么可以解析xml的?非常感谢!!!!
解决方案 »
- 串口发文件的问题
- com组件中怎么实现多线程数据共享
- 在IWebBrowser2中如何获得客户端证书和密钥句柄
- 字符的转换函数CSting to WCHAR
- 简单问题,100分,一会就结帐,在线WAITING…………
- 关于进程内组件的问题!
- 请教:
- ado访问数据库问题
- 读取word中嵌入的文本文件内容
- 绘制坐标轴刻度不符问题。
- 如何设置CFileDialog使之打开文件时只显示bmp文件
- 奇怪问题,要求置顶,win32 Dynamic-link library 连接 sybase 数据库的问题,详细请进http://community.csdn.net/Expert/TopicView3.asp
微软的开发包,支持dom和sax
#import <msxml.dll> named_guids
using namespace MSXML;class CAaaaDlg : public CDialog
{
......
protected:
CTreeCtrl m_TreeCtrl;
MSXML::IXMLDOMDocumentPtr m_plDomDocument;
MSXML::IXMLDOMElementPtr m_pDocRoot;
......
};//AaaaDlg.cpp
BOOL CAaaaDlg::OnInitDialog()
{
......
// TODO: 在此添加额外的初始化代码
//Initialize COM
::CoInitialize(NULL); HRESULT hr =
m_plDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
if( FAILED(hr))
{
_com_error er(hr);
AfxMessageBox(er.ErrorMessage());
EndDialog(1);
}
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}void CAaaaDlg::OnBnClickedOk()
{
CFileDialog fileDlg(TRUE);
if(IDOK == fileDlg.DoModal())
{
m_TreeCtrl.DeleteAllItems(); CString strFileName=(fileDlg.GetPathName()); //Convert XML file name string to somethinf
//COM can handle(bstr)
_bstr_t bstrFileName;
bstrFileName = strFileName.AllocSysString(); //Call the IXMLDOMDocumentPtr's load function
//to load the XML document.
variant_t vResult;
vResult = m_plDomDocument->load(bstrFileName); if(( (bool)vResult ) == TRUE)//success!
{
m_pDocRoot = m_plDomDocument->documentElement;
DisplayChildren(TVI_ROOT, m_pDocRoot);
if(0 == m_TreeCtrl.GetCount())
{
m_TreeCtrl.InsertItem("Empty document");
}
}
else
{
m_TreeCtrl.InsertItem("Document FAILED to load!");
}
}
}void CAaaaDlg::DisplayChildren(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pParent)
{
//Display the current node's name
HTREEITEM hItem = DisplayChild(hParent, pParent); //Simple for loop to get all children
for(MSXML::IXMLDOMNodePtr pChild = pParent->firstChild;
NULL != pChild; pChild = pChild->nextSibling)
{
//For each child, call this function so that you get
//its children as well.
hItem = DisplayChild(hItem, pChild);
DisplayChildren(hItem, pChild);
}
}HTREEITEM CAaaaDlg::DisplayChild(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pChild)
{
//Add the element's node name to the tree view
//and return the hItem.
CString strElement( (LPCTSTR)pChild->nodeName);
return m_TreeCtrl.InsertItem(strElement, hParent);
}
使用该接口不仅能够通过程序上载和分析XML文件或文档,而
且还可以用来遍历XML数据....可以找相关的书查一下:)
控件中分层展开的例子..
link 里面添加:msxml2.lib#include "msxml2.h"try
{
HRESULT hr;
IXMLDOMDocument* pXMLDoc;
IXMLDOMNode* pXDN;
//COM的初始化
hr=CoInitialize(NULL);
//得到关于IXMLDOMDocument接口的指针pXMLDOC
hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument,(void**) &pXMLDoc);
//将XML字符串转换成UNICODE,然后加载
VARIANT_BOOL bSuccess = false;
pXMLDoc->loadXML(L"<?xml version=\"1.0\" encoding=\"GB2312\"?><root><file><time>2003-10-13</time><content>内容</content><title>标题</title></file></root>",&bSuccess);
//得到已加载的XML字符串,并显示
LPWCH tempxml;
//因为此处是输出参数[out][retval],所以不用new一段空间
pXMLDoc->get_xml(&tempxml);
MessageBoxW(NULL,tempxml,L"XML正文",MB_OK);
//取到<time>,<title>以及<content>节点,并显示结点内容
pXMLDoc->selectSingleNode(L"//time",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"time值",MB_OK);
pXMLDoc->selectSingleNode(L"//title",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"title值",MB_OK);
pXMLDoc->selectSingleNode(L"//content",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"content值",MB_OK); //释放分配的资源
CoUninitialize();
}
catch(...)
{
AfxMessageBox("错误!");
}