2012-05-15 1 views
0

Я пытаюсь заменить узел в одном документе XML узлом из другого документа XML. Я получаю следующее сообщение об ошибке:Правильное использование MSXML replaceChild

Insert position node must be a Child of the node to insert under. 

Это упрощенная версия моего XML: XMLDOC1

<pages> 
    <page id="1"> 
    <content>First Document</content> 
    </page> 
</pages> 

Другой XML документ является точно такой же в составе: XMLDOC2

<pages> 
    <page id="1"> 
    <content>Second Document</content> 
    </page> 
</pages> 

Мне нужно заменить узел страницы первого документа узлом страницы второго документа. Моя попытка выглядит так:

firstNode = xmlDoc1.selectSingleNode("//page[@id=1]") 
secondNode = xmlDoc2.selectSingleNode("//page[@id=1]") 
xmlDoc1.replaceChild(firstNode, oldNode) 

Спасибо.

Решение

firstNode.parentNode.replaceChild(xmlDoc1.importNode(secondNode, true), firstNode) 

ответ

1

Синтаксис replaceChild является:

var objXMLDOMNode = oXMLDOMNode.replaceChild(newChild, oldChild); 
  • newChild - Объект. Адрес нового ребенка, который должен заменить старый ребенок. Если Null, oldChild удаляется без замены.
  • oldChild - Объект. Адрес старого ребенка, который должен быть заменен новым ребенком.

Похоже, что у вас есть Обратные аргументы. И узел, на котором вы запускаете replaceChild(), должен быть родителем узла, который вы заменяете. Вы не должны запускать его на document. И, наконец, поскольку вы заменяете узел из другого документа, вы должны сначала указать импорт с xmlDoc1.importNode(secondNode, true). Вы можете также рассмотреть cloning узел с cloneNode(deep), прежде чем использовать его в новом контексте (просто чтобы у вас была собственная копия).

p.s. не должно быть secondNode, а не oldNode в вашем фрагменте кода?

+0

Да, была опечатка. Я обновил свой код, и он отлично работает (см. Обновленный вопрос). Спасибо за разъяснение в бит importNode; Я заметил это где-то еще, но не знал, почему. – scader