2012-01-10 54 views
0

我正嘗試打開一個內存流以便與xmllite庫一起使用。寫一篇文章沒問題,但是從一篇文章中讀出來很難。以下是我正在使用的代碼。基本上我創建一個默認的xml字符串(LPWSTR),並使用CreateStreamOnHGlobal將其寫入內存流。然後,我尋求開始,並閱讀它,以確保它在那裏(它是)。然後我再找回來,並將其分配給閱讀器的輸入。它永遠不會超過該行:無法使用xmllite使用內存緩衝區讀取xml字符串

while (S_OK == (hr = pReader->Read(&nodeType))) 

我得到一個XmlNodeType_None和一個HRESULT值-1072894427。我相信它在閱讀流時遇到了困難,但我不確定。相同的代碼工作正常,如果我使用文件流,而不是從內存流寫入到xml

HRESULT hr = S_OK; CComPtr<IStream> pStream = NULL; 
IXmlReader *pReader = NULL; 
XmlNodeType nodeType; 

LPWSTR pwszXMLString = 
    L"<?xml version\"1.0\" encoding=\"UTF-8\" ?>\r\n" 
    L"<paramlist name=\"LP\">\r\n" 
     L"<value></value>\r\n" 
     L"<value></value>\r\n" 
    L"</paramlist>\r\n" 
    L"<param name=\"AutoConnect\">false</param>\r\n" 
    L"<param name=\"ConnectWhenLit\">false</param>\r\n" 
    L"<param name=\"SessionMaxBytes\">200000</param>\r\n" 
    L"<param name=\"SessionTimeoutSecs\">300</param>\r\n" 
    L"<param name=\"PacketDelayMs\">0</param>\r\n" 
    L"<param name=\"PacketSizeBytes\">4096</param>\r\n" 
    L"<param name=\"LowSSLSecurity\">true</param>\r\n"; 

DWORD dwWritten = 0; 
hr = CreateStreamOnHGlobal(NULL, FALSE, &pStream); 
hr = pStream->Write(pwszXMLString, wcslen(pwszXMLString) * sizeof(WCHAR), &dwWritten); 

// print out the contents of the memory stream just to make sure we have it 
LARGE_INTEGER pos; 
pos.QuadPart = 0; 
pStream->Seek(pos, STREAM_SEEK_SET, NULL); 
STATSTG ssStreamData = {0}; 
pStream->Stat(&ssStreamData, STATFLAG_NONAME); 
SIZE_T cbSize = ssStreamData.cbSize.LowPart; 
LPWSTR pwszContent = (WCHAR*) new BYTE[cbSize + sizeof(WCHAR)]; 
if (pwszContent == NULL) 
    return E_OUTOFMEMORY; 

pStream->Seek(pos, STREAM_SEEK_SET, NULL); 
SIZE_T cbRead; 
pStream->Read(pwszContent, cbSize, &cbRead); 
pwszContent[cbSize/sizeof(WCHAR)] = L'\0'; 

CZString czContent; 
czContent.LoadWideString(pwszContent, cbSize); 
wprintf(L"%S", czContent.GetString().c_str()); 
pStream->Seek(pos, STREAM_SEEK_SET, NULL); 

if (hr == S_OK) 
{ 
    typedef HRESULT (WINAPI *CreateXmlReaderFunc)(const IID & riid, void** ppvObject, IMalloc * pMalloc); 
    CreateXmlReaderFunc _CreateXmlReaderFunc = (CreateXmlReaderFunc)GetProcAddress(m_hXMLLite, "CreateXmlReader"); 

    if (FAILED(hr = _CreateXmlReaderFunc(__uuidof(IXmlReader), (void**) &pReader, NULL))) 
    { 
     MessageBox(NULL, CStringHelper::Format(L"Error: GetProcAddress() failed to find 'CreateXmlReader' %d\n", GetLastError()).c_str(), L"Error", MB_OK); 
     return -1; 
    } 

    pReader->SetInput(pStream); 
} 

while (S_OK == (hr = pReader->Read(&nodeType))) 
{ 
    switch (nodeType) 
    { 
        // parse xml here 
    } 
} 
return 0; 

回答

0

您的xml字符串不正確。 「版本」和「1.0」之間必須有「=」。其次,該字符串使用UTF-16,而標題聲明它是UTF-8。在標題中將UTF-8更改爲UTF-16或刪除編碼屬性。 要麼

LPWSTR pwszXMLString = 
L"<?xml version=\"1.0\" encoding=\"UTF-16\" ?>\r\n" 

LPWSTR pwszXMLString = 
L"<?xml version=\"1.0\"?>\r\n" 

作品。

+0

謝謝你是那個問題 – mountaineerduke 2012-05-11 15:18:19