xqiris进来,你的问题解答在这里,帮up的有分。

ThinkX 2003-01-10 12:41:16
由于太长,没法用短信息,写在这里了,那位大哥做过用msxml 3.0 中的SAX解析XML,帮助看看有没有错。

我没有msdn2001,也没有用过SAX解析XML, 所以我下载了一个msxml3的sdk,找到了文档。

所需要的接口是做回调用的,没必要用VCL的东西,自己写一个IUnknown的实现,很简单,我试验了一下,可以得到各种时间如startElement等解析xml,方法如下:
一个类,实现IUnknown功能:
//===================================

template <class IImpInterfaceT>
class TUnknownImpl : public IImpInterfaceT
{
public:
virtual ~TUnknownImpl() {}

virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,
void **ppvObject)
{
if (riid == __uuidof(IImpInterfaceT))
*ppvObject = static_cast<IImpInterfaceT*>(this);
else if (riid == IID_IUnknown)
*ppvObject = static_cast<IUnknown*>(this);
else
{
*ppvObject = 0;
return E_NOINTERFACE;
}
//此处没必要调用AddRef
return S_OK;
}

virtual ULONG STDMETHODCALLTYPE AddRef( void) { return 2; }
virtual ULONG STDMETHODCALLTYPE Release( void) { return 1; }
};

//===================================
使用这个类很简单,如下
class TSAXContentHandlerImpl: public TUnknownImpl<ISAXContentHandler>
{
//在这里实现ISAXContentHandler的各种接口。
};

//===================================

由于这个类的AddRef和Release无法管理资源必须自己管理,所以如下使用
class TForm1: public TForm
{
private:
TSAXContentHandlerImpl m_myContent1;
//或者TSAXContentHandlerImpl * m_myContent2;
//这时必须在结束时明确的delete m_myContent2;

};

//使用时很简单,如下
//其中的url参数我用的是一个本地的XML文件名。
void ParseXML(const AnsiString& url)
{
ISAXXMLReader* reader = NULL;
HRESULT hr = CoCreateInstance(
__uuidof(SAXXMLReader),
NULL,
CLSCTX_ALL,
__uuidof(ISAXXMLReader),
(void **)&reader);

if (SUCCEEDED(hr))
{
hr = reader->putContentHandler(&m_myContent1);
//或者hr = reader->putContentHandler(m_myContent2);
WideString wurl = WideString(url);
reader->parseURL(wurl.c_bstr());
reader->Release();
}
}

然后就等着收到各种事件吧。
...全文
26 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackLucifer 2003-01-10
  • 打赏
  • 举报
回复
me too.
^o^
Libran 2003-01-10
  • 打赏
  • 举报
回复
有分啊,那我就不客气了……
UP一下^_^
l_clove 2003-01-10
  • 打赏
  • 举报
回复
up,:)
neelee 2003-01-10
  • 打赏
  • 举报
回复
favorit 2003-01-10
  • 打赏
  • 举报
回复
好人呀!
接分!
ThinkX 2003-01-10
  • 打赏
  • 举报
回复
xqiris特地给我发个短信息,既然有困难,我正好也有时间,就帮着看看了,up的有分是想让高人看看有没有什么毛病或者是更好的方法,我也可以学习。
warton 2003-01-10
  • 打赏
  • 举报
回复
好人!!
liye20000 2003-01-10
  • 打赏
  • 举报
回复
up
tokens 2003-01-10
  • 打赏
  • 举报
回复
什么?????给别人答案还放分???
devie 2003-01-10
  • 打赏
  • 举报
回复
文章不错,顶
yyfzy 2003-01-10
  • 打赏
  • 举报
回复
我也是!

up!

To:Libran()
你都是猩猩了,还和我们抢,也没有点前辈的样子!
呵呵
yuyangmain 2003-01-10
  • 打赏
  • 举报
回复
我是才注册来的!!555~~~~
yuyangmain 2003-01-10
  • 打赏
  • 举报
回复
我是菜鸟啊?不照顾吗?前辈们??
ccrun.com 2003-01-10
  • 打赏
  • 举报
回复
顶。
yyfzy 2003-01-10
  • 打赏
  • 举报
回复
再次接分!

为升星做准备!

这个帖子不会被转到“非技术区”吧??
xqiris 2003-01-10
  • 打赏
  • 举报
回复
To ThinkX:
对了,我是新手。不知道CSDN的一些规定。
我怎么给分给你啊?
xqiris 2003-01-10
  • 打赏
  • 举报
回复
to ThinkX:

谢谢啦!
昨天已经解决了那个问题。
原因在于我不需要用Automation生成对象,进行接口继承。

MSDN里有VC写好的代码,我直接在BCB里增加unit。经过一番调试,已经可以正确的解析了。

但目前还是有一个问题,就是ISAXContentHandler有一个Skip的method,我怎么可以自己主动的发消息调此函数。
因为当我解析很大的文件时,我可能不解析其中的内容,直接跳过。

谢谢你啦!!!!真是热心人!
就是要流量 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊大家多给评论 点赞 关注啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧