我的这个解析xml的程序是个对话框程序,上面就有一个树控件和一个输入路径的编辑框,再就是一个确定按钮。输入xml文件的路径后,点击确定,就能把xml文件解析出来,然后值全部放入树控件中,可是不知为什么,当xml文件中包含着中文的时候总是报告如下错误:
Debug assertion failed!
program:
file:f:\fp\vctools\crt_bld\self_x86_crt\src\vcprintf.c
line:234
expression:string != NULL && sizeInByte > 0
解析xml文件至树控件的c++程序代码如下:
#include "stdafx.h"
#include "xmlparser.h"
#include "XmlParserDlg.h"#include <atlbase.h>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CXmlParserDlg dialogIMPLEMENT_DYNAMIC(CXmlParserDlg, CDialog);CXmlParserDlg::CXmlParserDlg(CWnd* pParent /*=NULL*/)
: CDialog(CXmlParserDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CXmlParserDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
}CXmlParserDlg::~CXmlParserDlg()
{
}void CXmlParserDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXmlParserDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CXmlParserDlg, CDialog)
//{{AFX_MSG_MAP(CXmlParserDlg)
ON_BN_CLICKED(IDC_GOBTN, OnGo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CXmlParserDlg message handlersBOOL CXmlParserDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
// Load the bitmap IDB_TREE into the tree control.
//
CImageList imgTree;
imgTree.Create(IDB_TREE,16,0,RGB(255,51,255));
CTreeCtrl *pTree = static_cast<CTreeCtrl*>(GetDlgItem(IDC_XMLTREE));
if ( pTree )
{
pTree->SetImageList(&imgTree,TVSIL_NORMAL);
imgTree.Detach();
} return TRUE; // return TRUE unless you set the focus to a control
}
///////////////////////////////////////////////////////////////////////////////
// OnGo
//
// This command is fired when the user selects the "Process" button.
//
void CXmlParserDlg::OnGo()
{
//
// Check the file specified exists.
//
CString strFileName;
CEdit *pEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT1));
if ( pEdit )
pEdit->GetWindowText(strFileName); //
// Assuming it's not an empty string, try to process.
//
if ( !strFileName.IsEmpty() )
{ if ( SUCCEEDED(CoInitialize(NULL)) )
{
IXMLDOMDocument *pDoc;
if ( SUCCEEDED (CoCreateInstance(CLSID_DOMDocument,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument,
reinterpret_cast<void**>(&pDoc))))
{
//
// Tell the "doc" that we're not going to load asynchronously.
//
if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
{
CComVariant vFile(strFileName);
VARIANT_BOOL vBool;
pDoc->load(vFile,&vBool);
if ( vBool == VARIANT_TRUE )
{
IXMLDOMNode *pNode;
if ( SUCCEEDED(pDoc->QueryInterface(IID_IXMLDOMNode,
reinterpret_cast<void**>(&pNode))))
{
CTreeCtrl *pTree = static_cast<CTreeCtrl*>(GetDlgItem(IDC_XMLTREE)); HTREEITEM hItem = pTree->GetChildItem(TVI_ROOT);
while( hItem != NULL )
{
HTREEITEM hNext = pTree->GetNextSiblingItem(hItem);
pTree->DeleteItem(hItem);
hItem = hNext;
}
IterateChildNodes(pNode,pTree);
pNode->Release();
pNode = NULL;
}
}
else
CheckLoad(pDoc);
}
pDoc->Release();
pDoc = NULL;
}
CoUninitialize();
}
}
}///////////////////////////////////////////////////////////////////////////////
// CheckLoad
//
// Ensure an XML document loaded correctly.
//
HRESULT CXmlParserDlg::CheckLoad(IXMLDOMDocument *pDoc)
{
HRESULT hResult = E_FAIL;
long lErrorCode = E_FAIL;
IXMLDOMParseError *pXMLError = NULL; if (SUCCEEDED(pDoc->get_parseError(&pXMLError))
&& SUCCEEDED(pXMLError->get_errorCode(&lErrorCode))
&& ( lErrorCode != 0 ) )
hResult = ReportError(pXMLError); //
// Clean-up pointers used.
//
if ( pXMLError )
{
pXMLError->Release();
pXMLError = NULL;
} //
// Pass back the return code.
//
return lErrorCode;
}
///////////////////////////////////////////////////////////////////////////////
// ReportError
//
// Standardised reporting mechanism for COM errors to do with XML.
//
HRESULT CXmlParserDlg::ReportError(IXMLDOMParseError *pXMLError)
{
long lLine;
long lLinePos;
long lErrorCode;
BSTR bstrFile;
BSTR bstrReason; //
// Whilst these could all return errors, we'll assume that since the
// COM was awake enough to report an error (and return the structure)
// that it can work with these calls.
//
pXMLError->get_line(&lLine);
pXMLError->get_linepos(&lLinePos);
pXMLError->get_errorCode(&lErrorCode);
pXMLError->get_reason(&bstrReason);
pXMLError->get_url(&bstrFile); //
// Format this message into a suitable output.
//
if ( lLine > 0 )
{
CString strError;
strError.Format(_T("Error processing XML file: %S\nError on line %d, position %d\n")
_T("Error (%x) text: %S"),
bstrFile,
lLine, lLinePos, lErrorCode,
bstrReason);
MessageBox(strError,_T("Parse Error"),MB_OK|MB_ICONERROR);
TRACE(_T("%s\n"),strError);
} SysFreeString(bstrFile);
SysFreeString(bstrReason);
return NOERROR;
}
Debug assertion failed!
program:
file:f:\fp\vctools\crt_bld\self_x86_crt\src\vcprintf.c
line:234
expression:string != NULL && sizeInByte > 0
解析xml文件至树控件的c++程序代码如下:
#include "stdafx.h"
#include "xmlparser.h"
#include "XmlParserDlg.h"#include <atlbase.h>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CXmlParserDlg dialogIMPLEMENT_DYNAMIC(CXmlParserDlg, CDialog);CXmlParserDlg::CXmlParserDlg(CWnd* pParent /*=NULL*/)
: CDialog(CXmlParserDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CXmlParserDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
}CXmlParserDlg::~CXmlParserDlg()
{
}void CXmlParserDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXmlParserDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CXmlParserDlg, CDialog)
//{{AFX_MSG_MAP(CXmlParserDlg)
ON_BN_CLICKED(IDC_GOBTN, OnGo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CXmlParserDlg message handlersBOOL CXmlParserDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
// Load the bitmap IDB_TREE into the tree control.
//
CImageList imgTree;
imgTree.Create(IDB_TREE,16,0,RGB(255,51,255));
CTreeCtrl *pTree = static_cast<CTreeCtrl*>(GetDlgItem(IDC_XMLTREE));
if ( pTree )
{
pTree->SetImageList(&imgTree,TVSIL_NORMAL);
imgTree.Detach();
} return TRUE; // return TRUE unless you set the focus to a control
}
///////////////////////////////////////////////////////////////////////////////
// OnGo
//
// This command is fired when the user selects the "Process" button.
//
void CXmlParserDlg::OnGo()
{
//
// Check the file specified exists.
//
CString strFileName;
CEdit *pEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT1));
if ( pEdit )
pEdit->GetWindowText(strFileName); //
// Assuming it's not an empty string, try to process.
//
if ( !strFileName.IsEmpty() )
{ if ( SUCCEEDED(CoInitialize(NULL)) )
{
IXMLDOMDocument *pDoc;
if ( SUCCEEDED (CoCreateInstance(CLSID_DOMDocument,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument,
reinterpret_cast<void**>(&pDoc))))
{
//
// Tell the "doc" that we're not going to load asynchronously.
//
if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
{
CComVariant vFile(strFileName);
VARIANT_BOOL vBool;
pDoc->load(vFile,&vBool);
if ( vBool == VARIANT_TRUE )
{
IXMLDOMNode *pNode;
if ( SUCCEEDED(pDoc->QueryInterface(IID_IXMLDOMNode,
reinterpret_cast<void**>(&pNode))))
{
CTreeCtrl *pTree = static_cast<CTreeCtrl*>(GetDlgItem(IDC_XMLTREE)); HTREEITEM hItem = pTree->GetChildItem(TVI_ROOT);
while( hItem != NULL )
{
HTREEITEM hNext = pTree->GetNextSiblingItem(hItem);
pTree->DeleteItem(hItem);
hItem = hNext;
}
IterateChildNodes(pNode,pTree);
pNode->Release();
pNode = NULL;
}
}
else
CheckLoad(pDoc);
}
pDoc->Release();
pDoc = NULL;
}
CoUninitialize();
}
}
}///////////////////////////////////////////////////////////////////////////////
// CheckLoad
//
// Ensure an XML document loaded correctly.
//
HRESULT CXmlParserDlg::CheckLoad(IXMLDOMDocument *pDoc)
{
HRESULT hResult = E_FAIL;
long lErrorCode = E_FAIL;
IXMLDOMParseError *pXMLError = NULL; if (SUCCEEDED(pDoc->get_parseError(&pXMLError))
&& SUCCEEDED(pXMLError->get_errorCode(&lErrorCode))
&& ( lErrorCode != 0 ) )
hResult = ReportError(pXMLError); //
// Clean-up pointers used.
//
if ( pXMLError )
{
pXMLError->Release();
pXMLError = NULL;
} //
// Pass back the return code.
//
return lErrorCode;
}
///////////////////////////////////////////////////////////////////////////////
// ReportError
//
// Standardised reporting mechanism for COM errors to do with XML.
//
HRESULT CXmlParserDlg::ReportError(IXMLDOMParseError *pXMLError)
{
long lLine;
long lLinePos;
long lErrorCode;
BSTR bstrFile;
BSTR bstrReason; //
// Whilst these could all return errors, we'll assume that since the
// COM was awake enough to report an error (and return the structure)
// that it can work with these calls.
//
pXMLError->get_line(&lLine);
pXMLError->get_linepos(&lLinePos);
pXMLError->get_errorCode(&lErrorCode);
pXMLError->get_reason(&bstrReason);
pXMLError->get_url(&bstrFile); //
// Format this message into a suitable output.
//
if ( lLine > 0 )
{
CString strError;
strError.Format(_T("Error processing XML file: %S\nError on line %d, position %d\n")
_T("Error (%x) text: %S"),
bstrFile,
lLine, lLinePos, lErrorCode,
bstrReason);
MessageBox(strError,_T("Parse Error"),MB_OK|MB_ICONERROR);
TRACE(_T("%s\n"),strError);
} SysFreeString(bstrFile);
SysFreeString(bstrReason);
return NOERROR;
}
解决方案 »
- 关于随机数的一个问题,求高手帮帮忙
- vc++6.0中如何提取picture控件框架内的内容
- 如何将picture control里面的内容除去
- 使用INT_PTR DialogBox()创建的窗口怎样才能获取它的HWND?
- 急.在PC机上发短信到手机上,有多少种方式能实现呢
- 急救!!!用Gif89a控件在Richedit实现类似QQ的动画表情。我自己import进去后出错,谁能帮一下。
- 事件和线程这两个概念帮忙说一下阿,搞不清了 谢谢
- 各位高手:请问有没有区分固定硬盘和移动硬盘的函数给100分
- 如何用新的VC程序替换已有工程中的VC程序?哪位高手帮忙详细说下,谢谢!
- 谁能推荐一个好的中英文(有其它语言更好)词典软件,(金山词霸就免了,那么多广告)
- 用什么函数创建带参数的线程
- DOM 怎么解析XML其中的空格
///////////////////////////////////////////////////////////////////////////////
// WalkTopLevel
//
bool CXmlParserDlg::IterateChildNodes(IXMLDOMNode *pNode,
CTreeCtrl *pTree,
HTREEITEM hParent)
{
BSTR bstrNodeName;
HTREEITEM hCurrentItem; if ( pTree )
{
if ( pNode )
{
CString strOutput;
pNode->get_nodeName(&bstrNodeName); //
// Find out the node type (as a string).
//
BSTR bstrNodeType;
pNode->get_nodeTypeString(&bstrNodeType);
CString strType;
strType.Format(_T("%S"),bstrNodeType);
SysFreeString(bstrNodeType); DOMNodeType eEnum;
pNode->get_nodeType(&eEnum); int nImg = 0; CString strValue;
if ( eEnum == NODE_TEXT )
{
BSTR bstrValue;
pNode->get_text(&bstrValue);
strOutput.Format(_T("%S"),bstrValue);
SysFreeString(bstrValue); nImg = 2;
}
else if ( eEnum == NODE_COMMENT )
{
VARIANT vValue;
pNode->get_nodeValue(&vValue);
CString strValue;
if ( vValue.vt == VT_BSTR )
strOutput.Format(_T("%S"),V_BSTR(&vValue));
else
strOutput.Format(_T("Unknown comment type"));
VariantClear(&vValue); nImg = 3;
}
else if ( eEnum == NODE_PROCESSING_INSTRUCTION )
{
strOutput.Format(_T("%S"), bstrNodeName);
nImg = 4;
}
else if ( eEnum == NODE_ELEMENT )
{
strOutput.Format(_T("%S"), bstrNodeName);
nImg = 5;
}
else
{
//
// Other types, include the type name.
//
strOutput.Format(_T("%S - %s"), bstrNodeName,strType);
}
SysFreeString(bstrNodeName); //
// Add it to the tree view.
//
TVINSERTSTRUCT tvItem;
tvItem.hParent = hParent ? hParent : TVI_ROOT;
tvItem.hInsertAfter = TVI_LAST;
tvItem.item.iImage = nImg;
tvItem.item.iSelectedImage = nImg;
tvItem.item.pszText = strOutput.GetBuffer(MAX_PATH);
tvItem.item.cchTextMax = MAX_PATH;
tvItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
hCurrentItem = pTree->InsertItem(&tvItem);
strOutput.ReleaseBuffer(); IterateAttibutes(pNode, pTree, hCurrentItem);
}
} //
// Any child nodes of this node need displaying too.
//
IXMLDOMNode *pNext = NULL;
IXMLDOMNode *pChild;
pNode->get_firstChild(&pChild);
while( pChild )
{
IterateChildNodes(pChild,pTree,hCurrentItem);
pChild->get_nextSibling(&pNext);
pChild->Release();
pChild = pNext;
} //
// Ensure after all of that, the item is expanded!
//
pTree->Expand(hCurrentItem,TVE_EXPAND);
return true;
}
///////////////////////////////////////////////////////////////////////////////
// IterateAttibutes
//
bool CXmlParserDlg::IterateAttibutes(IXMLDOMNode *pNode,
CTreeCtrl *pTree,
HTREEITEM hCurrentItem)
{
IXMLDOMNamedNodeMap *pAttrs; if ( SUCCEEDED(pNode->get_attributes(&pAttrs)) && (pAttrs != NULL) )
{
IXMLDOMNode *pChild;
pAttrs->nextNode(&pChild);
while(pChild)
{
BSTR bstrName;
VARIANT vValue;
pChild->get_nodeName(&bstrName);
pChild->get_nodeValue(&vValue);
CString strValue;
switch ( vValue.vt )
{
case VT_BSTR:
strValue.Format(_T("%S"),V_BSTR(&vValue));
break;
default:
strValue = _T("Unsupport type");
break;
}
CString strAttrib;
strAttrib.Format(_T("%S=%s"),bstrName,strValue);
SysFreeString(bstrName);
VariantClear(&vValue);
pChild->Release();
pAttrs->nextNode(&pChild);
//
// Add the attributes to the tree too.
//
TVINSERTSTRUCT tvAttribItem;
tvAttribItem.hParent = hCurrentItem;
tvAttribItem.hInsertAfter = TVI_LAST;
tvAttribItem.item.iImage = 1;
tvAttribItem.item.iSelectedImage = 1;
tvAttribItem.item.pszText = strAttrib.GetBuffer(MAX_PATH);
tvAttribItem.item.cchTextMax = MAX_PATH;
tvAttribItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
pTree->InsertItem(&tvAttribItem);
strAttrib.ReleaseBuffer();
}
pAttrs->Release();
}
return true;
}
<?xml version="1.0" encoding="utf-8"?>
<wml>
<card>湾保钓
<br/>
<br/><img src="http://wap.rerert.cn/resource/GD/GUANGZHOU/nfzm/7614/100-7614-0-0-0.png" alt="" />
<br/>月岛方向。
<br/>
<br/>这
<br/>川
<br/>低头
<br/>谢罪。
<br/>开
<br/>航行
<br/>间回到了38
<br/><a href="http://wap.ertertet.cn/content?newsid=62031&uid=0&from=kjava&newspp=2&pp=0&fontsize=500&action=">下一页</a>
<br/>1/8
<br/>
<br/><a href="" type="close">关闭</a>
<br/>
</card>
</wml>
<wml>
<card><![CDATA[湾保钓
<br/>
<br/><img src="http://wap.rerert.cn/resource/GD/GUANGZHOU/nfzm/7614/100-7614-0-0-0.png" alt="" />
<br/>月岛方向。
<br/>
<br/>这
<br/>川
<br/>低头
<br/>谢罪。
<br/>开
<br/>航行
<br/>间回到了38
<br/><a href="http://wap.ertertet.cn/content?newsid=62031&uid=0&from=kjava&newspp=2&pp=0&fontsize=500&action=">下一页</a>
<br/>1/8
<br/>
<br/><a href="" type="close">关闭</a>
<br/>
]]></card>
</wml>
http://www.firstobject.com/