【发布时间】:2013-06-13 20:16:07
【问题描述】:
我是否有一种简单的方法来获取 XML 文档的 IStream,然后将其加载到 IXMLDOMDocument (msxml) 中?最好不要将流写入磁盘。
【问题讨论】:
我是否有一种简单的方法来获取 XML 文档的 IStream,然后将其加载到 IXMLDOMDocument (msxml) 中?最好不要将流写入磁盘。
【问题讨论】:
检查this! More example.
基于ISequentialStream 的std::istream 实现示例:link。 (ISequentialStream 是IStream 的基类)。
// VARIANT_TRUE != TRUE !!!!!!!!!!!
VARIANT_BOOL retval = VARIANT_TRUE;
// document object created by CoCreateInstance
IXMLDOMDocument* xml_doc;
// own ISequentialStream/IStream instance (like example)
ISequentialStream* streamaddress;
// variant: could be IStream, ISequentialStream or IPersistStream
VARIANT xmlSource;
// variant init
VariantInit(&xmlSource);
// your object is an IUnknown interface
xmlSource.vt = VT_UNKNOWN;
// set its address
xmlSource.punkVal = streamaddress;
// load XML from stream
if ( ( xml_doc->load(xmlSource,&retval) == S_OK ) && ( retval == VARIANT_TRUE ) ) {
// done
}
【讨论】:
你可能想使用SHCreateMemStream:
bool load_xml_string(IXMLDOMDocument* xml_doc, std::string const& xml_string){
CComPtr<IStream> stream;
stream.Attach(SHCreateMemStream((const BYTE*)xml_string.c_str(),
(UINT)xml_string.size()));
VARIANT_BOOL load_result = VARIANT_FALSE;
return (xml_doc->load(CComVariant(static_cast<IUnknown*>(&stream)), &load_result) == S_OK &&
load_result == VARIANT_TRUE);
}
【讨论】: