使用 XmlLite IXmlWriter (C++) 在 prolog 中创建不带编码属性的 XML

Creating XML without encoding attribute in prolog using XmlLite IXmlWriter (C++)

本文关键字:创建 编码 属性 XML prolog IXmlWriter XmlLite C++ 使用      更新时间:2023-10-16

我正在使用XmlLite库创建一个XML文件。我希望生成的 XML 文件的 prolog 不包含编码属性(仅包含版本):

<?xml version="1.0"?>

这是我的代码:

    HRESULT hr = S_OK;
    IStream *pOutFileStream = NULL;
    IXmlWriter *pWriter = NULL;
    CComPtr<IXmlWriterOutput> pWriterOutput;
    //Open writeable output stream
    if (FAILED(hr = SHCreateStreamOnFile(output_file_name, STGM_CREATE | STGM_WRITE, &pOutFileStream)))
    {
        wprintf(L"Error creating file writer, error is %08.8lx", hr);
        HR(hr);
    }
    if (FAILED(hr = CreateXmlWriter(__uuidof(IXmlWriter), (void**) &pWriter, NULL)))
    {
        wprintf(L"Error creating xml writer, error is %08.8lx", hr);
        HR(hr);
    }
    if(FAILED(CreateXmlWriterOutputWithEncodingName(pOutFileStream, NULL, L"UTF-8", &pWriterOutput))){
        wprintf(L"Error setting xml encoding, error is %08.8lx", hr);
        HR(hr);
    }
    if (FAILED(hr = pWriter->SetOutput(pWriterOutput)))
    {
        wprintf(L"Error, Method: SetOutput, error is %08.8lx", hr);
        HR(hr);
    }
    if (FAILED(hr = pWriter->SetProperty(XmlWriterProperty_Indent, 4)))
    {
        wprintf(L"Error, Method: SetProperty XmlWriterProperty_Indent, error is %08.8lx", hr);
        HR(hr);
    }
    if (FAILED(hr = pWriter->WriteStartDocument(XmlStandalone_Omit)))
    {
        wprintf(L"Error, Method: WriteStartDocument, error is %08.8lx", hr);
        HR(hr);
    } 

我尝试删除对CreateXmlWriterOutputWithEncodingName()的调用,但即便如此,还是会创建带有 UTF-8 的默认编码属性。我还尝试将NULL作为该函数的第三个参数。

协助将不胜感激!

XML 声明由 WriteStartDocument 方法编写。

您可以使用 L"xml" 作为处理指令的名称来调用 WriteProcessingInstruction,而不是调用 WriteStartDocument ,以所需的方式编写 XML 声明,例如:

if (FAILED(hr = pWriter->WriteProcessingInstruction(L"xml", L"version="1.0"")))
{
    wprintf(L"Error, Method: WriteProcessingInstruction, error is %08.8lx", hr); 
    HR(hr); 
}

这会将 XML 声明写入为 <?xml version="1.0"?>