xqiris进来,你的问题解答在这里,帮up的有分。
由于太长,没法用短信息,写在这里了,那位大哥做过用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();
}
}
然后就等着收到各种事件吧。