2012-01-10 2 views
0

Я пытаюсь открыть поток в памяти для использования с библиотекой xmllite. Письмо на одно работает нормально, но чтение от одного затрудняет мне время. Ниже приведен код, который я использую. В основном я создаю строку xml по умолчанию (LPWSTR) и записываю ее в поток памяти с помощью CreateStreamOnHGlobal. Затем я пытаюсь начать и прочитать его, чтобы убедиться, что он там (это). Затем я снова ищу и назначу его на вход читателя. Она никогда не получает мимо линии:Невозможно прочитать строку xml с xmllite с помощью буфера памяти

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

я получаю XmlNodeType_None и значение HRESULT из -1072894427. Я считаю, что у него проблемы с чтением потока, но я точно не знаю. Тот же самый код работает отлично, если я использую FILESTREAM вместо и писать в 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

Смежные вопросы