MSXML loadXML не будет загружать элементы с префиксами пространства имен ... Почему? - PullRequest
0 голосов
/ 29 сентября 2011

Hiho,

Полагаю, это довольно глупый вопрос, но мне пришлось недавно переключиться на C / C ++ и не делать этого годами. И сейчас я застрял на следующем:

Заданный элемент XML в виде простой строки:

<myns:factor>1000</myns:factor>

Мне нужно проанализировать строку, добавить полученный элемент к окружающему объекту DOM MSXML2 в том же пространстве имен.

Прямо сейчас я пробую это так:

  HRESULT hr;

  MSXML2::IXMLDOMDocument2Ptr l_xmlFrame;
  MSXML2::IXMLDOMElementPtr l_xmlFrameDoc;

  hr = l_xmlFrame.CreateInstance(__uuidof(MSXML2::DOMDocument));

  if( !FAILED(hr) ) {

    l_xmlFrame->async = VARIANT_FALSE;
    l_xmlFrame->validateOnParse = VARIANT_TRUE;

    // p_strUnit holds the xml as a String
    l_xmlFrame->loadXML(p_strUnit);

  }

Вызов loadXML (...) просто не удался, но:

если я удаляю объявления пространства имен и элемент выглядит так:

<factor>1000</factor>

звонок работает отлично !

Я действительно не понимаю, почему функция loadXML не анализирует строку, когда заданы объявления пространства имен.

Любая помощь приветствуется !!!!! :)

Спасибо!

1 Ответ

3 голосов
/ 29 сентября 2011

Проблема

Строка

<myns:factor>1000</myns:factor>

не является правильно сформированным XML (в отношении пространств имен). Вот почему анализаторы XML обычно не загружают его.

Это не правильно сформировано, потому что он использует префикс пространства имен "myns", который не был объявлен.

Решение

Если бы вы изменили XML на что-то вроде этого, это бы хорошо сработало:

<myns:factor xmlns:myns="mynamespaceURI">1000</myns:factor>

Объявление пространства имен (xmlns:myns="mynamespaceURI") может использоваться для элемента, в котором используется префикс пространства имен, или для любого его предка.

Если вы не можете изменить входной XML, я бы тогда спросил поставщика XML: «Почему вы даете мне сломанный XML?»

...