【问题标题】:Using MXXMLWriter to output an XML document into a string使用 MXXMLWriter 将 XML 文档输出为字符串
【发布时间】:2012-11-29 15:25:38
【问题描述】:

我正在尝试将格式化的 XML 文档从 DOM 对象输出到字符串中,如下面的代码所示。问题是,虽然 dom->get_xml() 方法确实返回了一个值,但 MXXMLWriter->output 没有,正如您在屏幕截图中看到的那样。所有方法调用都返回 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);

【问题讨论】:

    标签: visual-c++ atl msxml


    【解决方案1】:

    文档指出

    输出可以是:

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

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

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

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

    相反,您尝试提供自己的缓冲区来填充,这是作者宣传的行为。

    【讨论】:

    • 您能详细说明一下吗?我有同样的问题,但我没有得到哪个对象需要“使用空字符串来指示作者”
    • @stu:您提供的参数是一个内部带有空字符串的变体。如果此文档摘录没有帮助,请提出一个新问题并提供不起作用的代码 sn-p。
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2021-08-28
    相关资源
    最近更新 更多