Загрузить XML в C ++ MSXML из байтового массива - PullRequest
2 голосов
/ 01 декабря 2009

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

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

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

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

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

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

Спасибо, Пол

1 Ответ

1 голос
/ 01 декабря 2009

Самый простой способ - передать функцию загрузки в безопасный массив. например,

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 на данных и передачи его в загрузку.

...