新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → VC使用sax出现错误,请用过的帮忙。感谢!! 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 12361 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: VC使用sax出现错误,请用过的帮忙。感谢!! 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     _bbc_ 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:55
      注册:2004/2/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给_bbc_发送一个短消息 把_bbc_加入好友 查看_bbc_的个人资料 搜索_bbc_在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看_bbc_的博客楼主
    发贴心情 VC使用sax出现错误,请用过的帮忙。感谢!!

    使用微软的MSXML4.0组件
    代码是参照微软的例子,链接http://www.microsoft.com/china/msdn/Archives/workshop/sax2jumpstart.asp
    编译时居然出现“未处理的异常:用户断点”,不知是什么来的,而且它的组件里面有很多纯虚函数要重写,这些函数SDK没有说明,不知有什么用,好像是SDK里面的函数调用这些函数似的。如代码中class MyContent : public MSXML2::ISAXContentHandler 的
    virtual HRESULT __stdcall raw_startDocument ( ) {return S_OK;}
    virtual HRESULT __stdcall raw_endDocument ( ) {return S_OK;}
    原来的tlh中有这样的定义:
          virtual HRESULT __stdcall raw_startDocument ( ) = 0;
          virtual HRESULT __stdcall raw_endDocument ( ) = 0;
    如果不重写它们自己创建的对象MyContent又无法实例化。

    代码如下,可能长一些:
    #include <iostream>
    #include <tchar.h>
    #import "D:\WINDOWS\System32\msxml4.dll"
    using namespace std;

    lass MyContent : public MSXML2::ISAXContentHandler
    {
    public:
     MyContent();    // 定义建立函数和解除函数。
     virtual ~MyContent();

     // 从 ISAXContentHandler 复制所有的方法。
     // 接口...
     virtual HRESULT STDMETHODCALLTYPE StartDocument(void);
     virtual HRESULT STDMETHODCALLTYPE EndDocument(void);
     //virtual HRESULT STDMETHODCALLTYPE StartPrefixMapping(const wchar_t__RPC_FAR *pwchPrefix,int cchPrefix,const wchar_t __RPC_FAR *pwchUri,int cchUri);
     virtual HRESULT STDMETHODCALLTYPE MyContent::StartElement(
     /* [in] */ const wchar_t *pwchNamespaceUri,
     /* [in] */ int cchNamespaceUri,
     /* [in] */ const wchar_t *pwchLocalName,
     /* [in] */ int cchLocalName,
     /* [in] */ const wchar_t  *pwchRawName,
     /* [in] */ int cchRawName,
     /* [in] */ MSXML2::ISAXAttributes  *pAttributes);
     // ...和底层的 IUnknown 接口...
     long __stdcall QueryInterface(const struct _GUID &,void ** );
     unsigned long __stdcall AddRef(void);
     unsigned long __stdcall Release(void);

          // ...和添加任何内容来简化实现。
    private:
     void prt ( char * pszFmt, const wchar_t __RPC_FAR *pwchVal, int cchVal);
     virtual HRESULT __stdcall raw_putDocumentLocator (/*[in]*/ struct MSXML2::ISAXLocator * pLocator ) {return S_OK;}
     virtual HRESULT __stdcall raw_startDocument ( ) {return S_OK;}
     virtual HRESULT __stdcall raw_endDocument ( ) {return S_OK;}
     virtual HRESULT __stdcall raw_startPrefixMapping (
      /*[in]*/ unsigned short * pwchPrefix,
      /*[in]*/ int cchPrefix,
      /*[in]*/ unsigned short * pwchUri,
      /*[in]*/ int cchUri ) {return S_OK;}
     virtual HRESULT __stdcall raw_endPrefixMapping (
      /*[in]*/ unsigned short * pwchPrefix,
      /*[in]*/ int cchPrefix ) {return S_OK;}
     virtual HRESULT __stdcall raw_startElement (
      /*[in]*/ unsigned short * pwchNamespaceUri,
      /*[in]*/ int cchNamespaceUri,
      /*[in]*/ unsigned short * pwchLocalName,
      /*[in]*/ int cchLocalName,
      /*[in]*/ unsigned short * pwchQName,
      /*[in]*/ int cchQName,
     /*[in]*/ struct MSXML2::ISAXAttributes * pAttributes ) {return S_OK;}
     virtual HRESULT __stdcall raw_endElement (
      /*[in]*/ unsigned short * pwchNamespaceUri,
      /*[in]*/ int cchNamespaceUri,
      /*[in]*/ unsigned short * pwchLocalName,
      /*[in]*/ int cchLocalName,
      /*[in]*/ unsigned short * pwchQName,
      /*[in]*/ int cchQName ) {return S_OK;}
     virtual HRESULT __stdcall raw_characters (
      /*[in]*/ unsigned short * pwchChars,
      /*[in]*/ int cchChars ){return S_OK;}
     virtual HRESULT __stdcall raw_ignorableWhitespace (
      /*[in]*/ unsigned short * pwchChars,
      /*[in]*/ int cchChars ){return S_OK;}
     virtual HRESULT __stdcall raw_processingInstruction (
      /*[in]*/ unsigned short * pwchTarget,
      /*[in]*/ int cchTarget,
      /*[in]*/ unsigned short * pwchData,
      /*[in]*/ int cchData ) {return S_OK;}
     virtual HRESULT __stdcall raw_skippedEntity (
      /*[in]*/ unsigned short * pwchName,
      /*[in]*/ int cchName ){return S_OK;}
    };

    MyContent::MyContent()  {}    
    MyContent::~MyContent() {}  

    // 现在完成 IUnknown 填充。
    // (然而,请牢记,若希望将处理程序作为 COM 对象来实现,
    //  可以添加比用这些方法显示的
    //  更多的功能)
    long __stdcall MyContent::QueryInterface(const struct _GUID &,void ** )
          { return 0; }
    unsigned long __stdcall MyContent::AddRef() { return 0; }
    unsigned long __stdcall MyContent::Release() { return 0; }

    //现在开始着手业务。
    // 首先确定您需要的和不需要的事件。
    // 对于不需要的方法,处理很简单:
    HRESULT STDMETHODCALLTYPE MyContent::StartDocument()
    {
       return S_OK;   // 返回 S_OK 以继续。
                      // 任何返回的错误代码都将中止语法分析。
    }

    // 对于需要的事件,您可随意处理!
    HRESULT STDMETHODCALLTYPE MyContent::StartElement(
          /* [in] */ const wchar_t  *pwchNamespaceUri,
          /* [in] */ int cchNamespaceUri,
          /* [in] */ const wchar_t  *pwchLocalName,
          /* [in] */ int cchLocalName,
          /* [in] */ const wchar_t  *pwchRawName,
          /* [in] */ int cchRawName,
       /* [in] */ MSXML2::ISAXAttributes  *pAttributes)
    {
    //我想打印标志名称。
       prt("\n<%s>",pwchLocalName,cchLocalName);  
       return S_OK;
    }

    HRESULT STDMETHODCALLTYPE MyContent::EndDocument(){return S_OK;};

    //“prt” 是一个专用方法。
    // SAX 不使用它。您不必实现它和任何其他
    // 专用方法。
    // 这仅是快速打印。
    void MyContent::prt ( char * pszFmt, const wchar_t __RPC_FAR *pwchVal, int cchVal )
    {
       static wchar_t fmt[1000], val[1000];
       mbstowcs( fmt, pszFmt, 999 ); fmt[999] = 0;
       wcsncpy( val, pwchVal, (cchVal>999?999:cchVal+1) ); val[999] = 0;
       wprintf(fmt,val);
       return;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {

     CoInitialize(NULL);
     try
     {
      //测试MSXML组件
      MSXML2::ISAXXMLReaderPtr pReader(_uuidof(MSXML2::SAXXMLReader));
      MyContent *pContent =new MyContent();
      //pReader->putContentHandler(pContent);
      //pReader->putBaseURL("LogicRe.ytml");
      pReader->Release();
     }
        catch(_com_error e)
     {
      cerr<<e.Description();
     }
        CoUninitialize();
     return 0;
    }

    有谁知道哪里出问题了啊?或者有什么更好的方案可以选择,请指教。谢谢大家啦!!!


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/7 17:06:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/18 7:15:02

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    7,462.891ms