Visual c++ 使用MXXMLWriter将XML文档输出为字符串

Visual c++ 使用MXXMLWriter将XML文档输出为字符串,visual-c++,atl,msxml,Visual C++,Atl,Msxml,我试图将格式化的XML文档从DOM对象输出到字符串中,如下面的代码所示。问题是,虽然dom->get_xml()方法确实返回了一个值,但MXXMLWriter->输出并没有返回值,正如您在屏幕截图上看到的那样。所有方法调用都返回S_OK。这里可能有什么问题 这是我的密码: CComPtr<IMXWriter> w; HRESULT hr; hr = w.CoCreateInstance(__uuidof(MXXMLWriter), NULL, CLSCTX_INPROC_SERVER

我试图将格式化的XML文档从DOM对象输出到字符串中,如下面的代码所示。问题是,虽然dom->get_xml()方法确实返回了一个值,但MXXMLWriter->输出并没有返回值,正如您在屏幕截图上看到的那样。所有方法调用都返回S_OK。这里可能有什么问题

这是我的密码:

CComPtr<IMXWriter> w;
HRESULT hr;
hr = w.CoCreateInstance(__uuidof(MXXMLWriter), NULL, CLSCTX_INPROC_SERVER);

hr = w->put_indent(VARIANT_TRUE);

CComPtr<ISAXXMLReader> rd;
hr = rd.CoCreateInstance(__uuidof(SAXXMLReader60), NULL, CLSCTX_INPROC_SERVER);

CComPtr<ISAXContentHandler> hc;
hr = w.QueryInterface<ISAXContentHandler>(&hc);
CComPtr<ISAXErrorHandler> he;
hr = w.QueryInterface<ISAXErrorHandler>(&he);
CComPtr<ISAXDTDHandler> hd;
hr = w.QueryInterface<ISAXDTDHandler>(&hd);

hr = rd->putContentHandler(hc);
hr = rd->putErrorHandler(he);
hr = rd->putDTDHandler(hd);
hr = rd->putProperty(L"http://xml.org/sax/properties/lexical-handler", CComVariant(w));
hr = rd->putProperty(L"http://xml.org/sax/properties/declaration-handler", CComVariant(w));

BSTR body = ::SysAllocStringLen(NULL, 1024);
ZeroMemory(body, 1024 * sizeof(OLECHAR));
CComVariant out(body);
w->put_encoding(CComBSTR(L"utf-8"));
hr = w->put_output(out);
hr = rd->parse(CComVariant(dom));

dom->get_xml(&xmlStr);

return std::wstring(xmlStr);
CComPtr w;
HRESULT-hr;
hr=w.CoCreateInstance(uuuIdof(MXXMLWriter),NULL,CLSCTX_INPROC_SERVER);
hr=w->put\u缩进(变量为真);
货币路;
hr=rd.CoCreateInstance(uuuuidof(SAXXMLReader60),NULL,CLSCTX_INPROC_SERVER);
CComPtr hc;
hr=w.QueryInterface(&hc);
他说;
hr=w.QueryInterface(&he);
CComPtr hd;
hr=w.QueryInterface(&hd);
hr=rd->putContentHandler(hc);
hr=rd->putErrorHandler(he);
hr=rd->putDTDHandler(hd);
hr=rd->putProperty(L)http://xml.org/sax/properties/lexical-handler“,c变异(w));
hr=rd->putProperty(L)http://xml.org/sax/properties/declaration-handler“,c变异(w));
BSTR body=::SysAllocStringLen(NULL,1024);
零内存(body,1024*sizeof(ollechar));
c变异输出(体);
w->put_编码(CComBSTR(L“utf-8”);
hr=w->输出输出(out);
hr=rd->parse(CComVariant(dom));
dom->get_xml(&xmlStr);
返回std::wstring(xmlStr);

文件中说明:

输出可以是:

  • IStream接口的任何实现。(生成的文件将写入提供的IStream)
  • 一串
  • 文档对象
有关将输出属性设置为DOMDocument对象的更多信息,请参阅从SAX事件创建DOMDocument对象

将此属性设置为空值(VT_empty或“”)会将输出返回到内部字符串并将其重置

你显然想让作者来填充字符串。所以建议使用一个空字符串来指示writer填充其内部缓冲区,然后您可以通过属性getter获得它


相反,您尝试提供自己的缓冲区以供填充,这是编写者的广告行为。

您能详细说明吗?我也有同样的问题,但我不知道哪个对象需要“使用空字符串来指示编写器”@stu:您提供的参数是一个内部带有空字符串的变量。如果此文档摘录没有帮助,请开始一个新问题,并提供不起作用的代码段。