使用MXXMLWriter将XML文档输出到字符串中

时间:2012-11-29 15:25:39

标签: 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);

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);

enter image description here

1 个答案:

答案 0 :(得分:0)

文档说明了

输出可以是:

  
      
  • IStream接口的任何实现。 (生成的文档将写入提供的IStream)。
  •   
  • 一个字符串。
  •   
  • DOMDocument对象。
  •   
     

有关将输出属性设置为DOMDocument对象的更多信息,请参阅从SAX事件创建DOMDocument对象。

     

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

你显然希望编写者填充字符串。因此建议使用空字符串来指示writer填充其内部缓冲区,然后您可以通过property getter获取它。

您改为尝试提供自己的缓冲区,这是作者的广告行为。