Лучший способ удалить объявление XML из BSTR

Мне интересно, может ли кто-нибудь помочь мне удалить объявление XML из строки, содержащей XML-документ. Любая помощь будет оценена по достоинству. Мы используем MSXML 4.0, но у меня возникли трудности с его использованием, и в итоге я просто сделал подстроку. Я не очень хорошо знаком с ATL и другими Microsoft SDK. Это работает, но небольшая часть меня умерла внутри, и я бы предпочел, чтобы это было сделано менее хрупким образом.

Изменить: в настоящее время я делаю подстроку при первом появлении символа новой строки. Я пытался использовать токен или подстроку в «?>» декларации XML, но у меня возникли проблемы с получением соответствия символов (с использованием wcstok и подстроки). Я пробовал "\?>", "\?>" и "?>". Идеальным решением было бы загрузить документ в объект XMLDocument и просто получить текст тела сообщения.


person binarymelon    schedule 11.06.2012    source источник
comment
Можете ли вы добавить код к вопросу, чтобы проиллюстрировать проблему? в чем именно проблема?: Что такое «хрупкое» сейчас?   -  person PermanentGuest    schedule 11.06.2012
comment
Вопрос обновлен с дополнительной информацией.   -  person binarymelon    schedule 11.06.2012


Ответы (1)


Посмотрите спецификацию XML, особенно грамматику для prolog:

[22] пролог ::= XMLDecl? Разное* (doctypedecl Разное*)?

[23] XMLDecl ::= '‹?xml' VersionInfo EncodingDecl? SDDecl? С? '?›'

Таким образом, ваш ручной код должен уметь анализировать VersionInfo, EncodingDecl и SDDecl вместе с начальными и конечными токенами тега объявления XML. Для получения дополнительной информации об этих отдельных элементах см. спецификацию.

Тем не менее, я бы предложил использовать правильный инструмент для правильной работы: используйте инструментарий/анализатор XML. (Разница между синтаксическим анализатором и набором инструментов в основном заключается в том, что набор инструментов будет поддерживать расширенные операции, такие как проверка DTD, обработка пространства имен, XPath и т. д.).

MSXML4 довольно старый. MSXML6 является последним. Однако MSXML6 совершенно бесполезен для всего, кроме небольших XML-файлов. Итак, выбирайте парсер в зависимости от размера вашего входного файла (если важна производительность). Существуют бесплатные библиотеки, такие как Xerces, RapidXML, pugixml и т. д., которые имеют намного лучшую производительность.

Кроме того, можете ли вы указать, с какими трудностями вы столкнулись при работе с MSXML4?

person dirkgently    schedule 11.06.2012