2012-03-21 2 views
0

Используя функции MSXML2 из библиотеки msxml3.dll, я пытаюсь дублировать разделы в документе XML, но он не работает так, как я ожидал.Метод MSXML node.clode не работает должным образом

Вот XML:

<result> 
    <Target> 
      <Point> 
      <pos dimension="2">60.384005 5.333862</pos> 
      </Point> 
     </Target> 
</result> 

То, что я хочу, чтобы добавить несколько разделов. Поэтому я хочу взять узел, дублировать его и поместить его под существующий узел <Target>. Я почти уверен, что должен использовать метод Clone, но он, похоже, не работает. код C++:

typedef MSXML2::IXMLDOMNodePtr XmlNode; 

    XmlNode pNode = pXMLRequest->selectSingleNode("//result"); 
if(pNode==NULL) 
    { m_szErrorText = m_szErrorText + _T(" 'result' node not found");return FALSE;}  

    XmlNode pTargetNode = pNode->selectSingleNode("Target"); 
    XmlNode pNewTargetNode = pTargetNode->cloneNode(true); 
    pNode->appendChild(pNewTargetNode); 

Но когда я запускаю этот код ничего не происходит с документом XML. И когда я проверяю XML-текст в pNewTargetNode, я вижу только '<result>', который является только именем узла. В то время как я ожидал, что он будет содержать все узлы в <Target>...</Target>. Есть что-то, чего я не хватает?

+0

Можете ли вы предоставить сообщение исключения? – Seb

+0

Я ошибся. Код, показанный выше, фактически не генерирует исключение (это выдержка из более крупного раздела). Он просто не работает, сам XML не изменился. Я удалил текст исключения из вопроса. –

ответ

1

Я использовал неправильный тип «истина». Если я заменяю

XmlNode pNewTargetNode = pTargetNode->cloneNode(true); 

с

XmlNode pNewTargetNode = pTargetNode->cloneNode(VARIANT_TRUE); 

он работает отлично. Я уже думал об этом и использовал TRUE вместо true, но это тоже не сработает. Итак, при использовании библиотеки msxml всегда используйте VARIANT_BOOL, VARIANT_FALSE и VARIANT_TRUE.

Raymond Chen объясняет, почему существует так много вариантов: http://blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspx