以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  像高手请教一个dom 加载 xml文件的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=24863)


--  作者:mimimi
--  发布时间:12/1/2005 10:11:00 AM

--  像高手请教一个dom 加载 xml文件的问题
我用dom+vc解析xml文件。xml文件的一部分如下
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL SCL.xsd">

程序一部分:m_pDomDoc->async = VARIANT_FALSE;
 m_pDomDoc->validateOnParse = VARIANT_TRUE;
 m_pDomDoc->resolveExternals = VARIANT_TRUE;

 // Configure DOM properties for namespace selection.

 m_pDomDoc->load(“my.xml”);
 
 MSXML2::IXMLDOMParseErrorPtr pObjError;
 if(m_pDomDoc->get_parseError(&pObjError)!=0)
 {
  pObjError->get_reason(&bstr);
  CString str;
  str.Format("从%s中不能加载DOM。%S", dlg.GetFileName(), bstr);
  AfxMessageBox(str);
  SysFreeString(bstr);
  return;
 }
这种情况下,程序找不到scl.xsd,但是load通过,一切正常,就是scl.xsd中的schema未得到应用。但是我把scl.xsd的路径正确的加上后,<SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL d:\xcd\SCL.xsd">,load函数就出错了,奇怪的是错误信息是空的。
刚用dom不久,好多问题还搞不清初,还请高手指教。


--  作者:mimimi
--  发布时间:12/2/2005 10:38:00 AM

--  
没人知道吗?
--  作者:wangjia184
--  发布时间:12/15/2005 1:30:00 PM

--  
给你看段代码

_bstr_t validateFile(_bstr_t strFile)
{

   // Declare and initialize variables
   IXMLDOMSchemaCollectionPtr   pXS;
   IXMLDOMDocument2Ptr          pXD = NULL;
   IXMLDOMParseErrorPtr        pErr = NULL;
   _bstr_t                strResult = "";

   // Create a schema cache and add books.xsd to it.
   HRESULT hr = pXS.CreateInstance(__uuidof(XMLSchemaCache40));
   hr = pXS->add("urn:books", "sc.xsd");

   // Create a DOMDocument and set its properties.
   hr = pXD.CreateInstance(__uuidof(DOMDocument40));

   // Assign the schema cache to the DOMDocument's
   // schemas collection.
   pXD->schemas = pXS.GetInterfacePtr();

   // Load books.xml as the DOM document.
   pXD->async = VARIANT_FALSE;
   pXD->validateOnParse = VARIANT_TRUE;
   pXD->resolveExternals = VARIANT_TRUE;
   hr = pXD->load(strFile);

   pErr = pXD->parseError;

   // Return validation results in message to the user.
   if (pErr->errorCode != S_OK)
   {
      strResult = _bstr_t("Validation failed on ") + strFile +
         _bstr_t("\n=====================") +
         _bstr_t("\nReason: ") + _bstr_t(pErr->Getreason()) +
         _bstr_t("\nSource: ") + _bstr_t(pErr->GetsrcText()) +
         _bstr_t("\nLine: ") + _bstr_t(pErr->Getline()) +
         _bstr_t("\n");
   }
   else
      strResult = _bstr_t("Validation succeeded for ") + strFile +
         _bstr_t("\n======================\n") +
         _bstr_t(pXD->xml) + _bstr_t("\n");

   return strResult;

   // Clean up and destroy objects.
   if (pXS) pXS.Release();
   if (pXD) pXD.Release();
   if (pErr) pErr.Release();
}

void main()
{
   CoInitialize(NULL);
   try{
      _bstr_t sOutput = validateFile("sc-valid.xml");
      sOutput += validateFile("sc-notValid.xml");
      MessageBox(NULL,sOutput, "schemaCache",MB_OK);
   }
   catch(_com_error &e)
   {
      dump_com_error(e);
   }
}

void dump_com_error(_com_error &e)
{
   printf("Error\n");
   printf("\a\tCode = %08lx\n", e.Error());
   printf("\a\tCode meaning = %s", e.ErrorMessage());
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());
   printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
}


--  作者:wangjia184
--  发布时间:12/15/2005 1:33:00 PM

--  
把 上面 代码中的
hr = pXS->add("urn:books", "sc.xsd");
改成


--  作者:wangjia184
--  发布时间:12/15/2005 1:34:00 PM

--  

把 上面 代码中的
hr = pXS->add("urn:books", "sc.xsd");
改成

nResult = pIXMLDOMSchemaCollection2Ptr->add(_T("x-schema:books"), _T("c:\\books.xsd"));

之类的 应该就可以了


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
7,554.688ms