在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文件中关于外部定义的那行删除,程序就可以运行,不知道为啥。请各位不吝赐教,万分感谢!