2009-11-30 1 views
2

Я получаю XML через сетевой сокет. Мне нужно взять этот XML и загрузить его в DOM для выполнения дальнейших операций. MSXML требует ввода строк, которые находятся в UCS-2 или UTF-16 и полностью игнорирует заголовок XML с типом кодирования при загрузке из строки. Он позволяет загружать фрагменты XML, поэтому это имеет смысл.Загрузить XML в C++ MSXML из массива байтов

Я вижу два возможных пути решения этой проблемы:

1) Запись файла на диск и загрузить его в MSXML через путь к файлам. Дополнительный дисковый ввод-вывод делает этот подход далеко не предпочтительным.

2) Пик в заголовок XML, чтобы вручную определить кодировку, а затем вызвать MultiByteToWideChar для преобразования в UTF-16 и указать кодовую страницу на основе обнаруженной кодировки. Этот подход работает нормально, но я хотел бы нажать обнаружение кодировки на MSXML.

Есть ли у кого-нибудь другие идеи о том, как это сделать?

Я не рассматривал другие синтаксические анализаторы XML, но был бы заинтересован в том, как это делают аналитики DOM без MSXML.

Спасибо, Пол

ответ

1

Простейшее способ передать функцию загрузки безопасного массива. например

const char* xml = "<root/>"; 

SAFEARRAYBOUND rgsabound[1]; 
rgsabound[0].lLbound = 0; 
rgsabound[0].cElements = strlen(xml); 

SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, rgsabound); 
memcpy(psa->pvData, xml, strlen(xml)); 
VARIANT v; 

VariantInit(&v); 
V_VT(&v) = VT_ARRAY | VT_UI1; 
V_ARRAY(&v) = psa; 
VARIANT_BOOL fSuccess; 
pXMLDoc->load(v, &fSuccess); 
if(fSuccess == VARIANT_TRUE) 
{ 
    /* Do Something */ 
} 

Очевидно, что проверка ошибок не происходит или освобождение ресурсов.

Или используйте CreateStreamOnHGlobal для создания IStream на данных и передачи этого в нагрузку.