在vc环境下,我对一个有外部dtd定义的xml文件进行读取,发现有错,程序如下:
void CDataDB::OnOpenFile()
{
// TODO: Add your control notification handler code here
CFileDialog dialog1(TRUE, "xml", "*.xml");
if (dialog1.DoModal() == IDOK)
{
m_FilePathName = dialog1.GetPathName();
UpdateData(FALSE);
}
}void CDataDB::OnGetFile()
{
// TODO: Add your control notification handler code here
//创建"DOMDocument"对象
m_ListName.ResetContent();
m_ListValue.ResetContent();
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
// HRESULT hr = pDoc.CreateInstance("Msxml2.DOMDocument.4.0") ;
if(!SUCCEEDED(hr))
{ MessageBox("无法创建DOMDocument"对象,请检查是否安装了MS XML Parser 运行库!"); } //加载文件
// pDoc->load("f:\\main\\sen0001.xml");
pDoc->load(m_FilePathName.GetBuffer(0)); //在树中查找名为syllable的节点,"//"表示在任意层查找
MSXML2::IXMLDOMElementPtr childNode ;
IXMLDOMElementPtr pXMLDocElement = NULL;
pXMLDocElement = pDoc->documentElement;
IXMLDOMNodeListPtr pXMLDomNodeList = NULL;
pXMLDomNodeList = pXMLDocElement->selectNodes("//syllable");//单步运行到这边出错
//是不是要对外部的dtd文件处理一下啊
IXMLDOMDocumentTypePtr docTypPtr = pDoc->doctype;
int count = 0;
count = pXMLDomNodeList->Getlength();
for (int j=0; j<count; j++)
{
childNode = (MSXML2::IXMLDOMElementPtr)pXMLDomNodeList->Getitem(j); //得到节点类型
MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType); //节点名称
BSTR var;
CString name;
childNode->get_nodeName(&var);
name = (char*)(_bstr_t)var;
//节点值
VARIANT varVal;
childNode->get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal; //节点属性,放在链表中
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrs);
long nCount ;
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{ pAttrs->get_item(i,&pAttrItem); //我们也可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
m_ListName.InsertString(-1, strAttrName);
m_ListValue.InsertString(-1, strAttrValue);
UpdateData(FALSE); }
}
}
我把xml文件中关于外部定义的那行删除,程序就可以运行,不知道为啥。请各位不吝赐教,万分感谢!
void CDataDB::OnOpenFile()
{
// TODO: Add your control notification handler code here
CFileDialog dialog1(TRUE, "xml", "*.xml");
if (dialog1.DoModal() == IDOK)
{
m_FilePathName = dialog1.GetPathName();
UpdateData(FALSE);
}
}void CDataDB::OnGetFile()
{
// TODO: Add your control notification handler code here
//创建"DOMDocument"对象
m_ListName.ResetContent();
m_ListValue.ResetContent();
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
// HRESULT hr = pDoc.CreateInstance("Msxml2.DOMDocument.4.0") ;
if(!SUCCEEDED(hr))
{ MessageBox("无法创建DOMDocument"对象,请检查是否安装了MS XML Parser 运行库!"); } //加载文件
// pDoc->load("f:\\main\\sen0001.xml");
pDoc->load(m_FilePathName.GetBuffer(0)); //在树中查找名为syllable的节点,"//"表示在任意层查找
MSXML2::IXMLDOMElementPtr childNode ;
IXMLDOMElementPtr pXMLDocElement = NULL;
pXMLDocElement = pDoc->documentElement;
IXMLDOMNodeListPtr pXMLDomNodeList = NULL;
pXMLDomNodeList = pXMLDocElement->selectNodes("//syllable");//单步运行到这边出错
//是不是要对外部的dtd文件处理一下啊
IXMLDOMDocumentTypePtr docTypPtr = pDoc->doctype;
int count = 0;
count = pXMLDomNodeList->Getlength();
for (int j=0; j<count; j++)
{
childNode = (MSXML2::IXMLDOMElementPtr)pXMLDomNodeList->Getitem(j); //得到节点类型
MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType); //节点名称
BSTR var;
CString name;
childNode->get_nodeName(&var);
name = (char*)(_bstr_t)var;
//节点值
VARIANT varVal;
childNode->get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal; //节点属性,放在链表中
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrs);
long nCount ;
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{ pAttrs->get_item(i,&pAttrItem); //我们也可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
m_ListName.InsertString(-1, strAttrName);
m_ListValue.InsertString(-1, strAttrValue);
UpdateData(FALSE); }
}
}
我把xml文件中关于外部定义的那行删除,程序就可以运行,不知道为啥。请各位不吝赐教,万分感谢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货