Поделиться через


Копирование существующих узлов из одного документа в другой

Метод ImportNode позволяет скопировать узел или целое поддерево узлов из одного документа XmlDocument в другой. Узел, возвращенный после вызова, является копией узла из исходного документа, включая значения атрибутов, имя узла, тип узла и все атрибуты, связанные с пространством имен, такие как префикс, локальное имя и URI пространства имен. Исходный документ не изменяется. После импорта узла его необходимо добавить к дереву с помощью одного из методов, используемых для вставки узлов.

При присоединении узла к новому документу, узел принадлежит этому документу. Причина в том, что каждый узел при создании принадлежит какому-нибудь документу, даже если узлы создаются в разных фрагментах документа. Это требование объектной модели DOM XML-документа, которое обусловлено структурой создания фабрики в классе XmlDocument. Например, метод CreateElement является единственным способом создания новых узлов.

В зависимости от типа импортированного узла и значения параметра deep, дополнительные данные копируются по мере необходимости. Этот метод пытается зеркально воспроизвести поведение, ожидаемое, если фрагмент исходного XML или HTML копируется из одного документа в другой, с учетом того факта, касающегося XML, что два документа могут иметь различные определения типа документа (DTD).

В следующей таблице описаны особенности поведения каждого типа узла, который может быть импортирован.

Тип узла Параметр deep имеет значение TRUE Параметр deep имеет значение FALSE
XmlAttribute Specified в XmlAttribute имеет значение TRUE. Потомки исходного узла XmlAttribute рекурсивно импортируются, а результирующие узлы собираются в поддерево. Параметр deep не применяется к узлам XmlAttribute, так как вместе с ними всегда импортируются дочерние узлы.
XmlCDataSection Копирует узел вместе с данными. Копирует узел вместе с данными.
XmlComment Копирует узел вместе с данными. Копирует узел вместе с данными.
XmlDocumentFragment Потомки исходного узла рекурсивно импортируются, а результирующие узлы создаются заново и составляют соответствующее поддерево. Создается пустой узел XmlDocumentFragment.
XmlDocumentType Копирует узел вместе с данными.* Копирует узел вместе с данными.*
XmlElement Потомки исходного элемента рекурсивно импортируются, а результирующие узлы создаются заново и составляют соответствующее поддерево. Примечание. Атрибуты по умолчанию не копируются. Если документ, в который выполняется импорт, определяет атрибуты по умолчанию для данного имени элемента, они назначаются. Импортируются указанные атрибутивные узлы исходного элемента, а затем созданные узлы XmlAttribute присоединяются к новому элементу. Узлы-потомки не копируются. Примечание. Атрибуты по умолчанию не копируются. Если документ, в который выполняется импорт, определяет атрибуты по умолчанию для данного имени элемента, они назначаются.
XmlEntityReference Так как в исходном и целевом документах сущности могут быть определены по-разному, этот метод копирует только узел XmlEntityReference. Текст замены не включается. Если в документе назначения определена сущность, ей назначается значение. Так как в исходном и целевом документах сущности могут быть определены по-разному, этот метод копирует только узел XmlEntityReference. Текст замены не включается. Если в документе назначения определена сущность, ей назначается значение.
XmlProcessingInstruction Копирует цель и значение данных из импортируемого узла. Копирует цель и значение данных из импортируемого узла.
XmlText Копирует узел вместе с данными. Копирует узел вместе с данными.
XmlSignificantWhitespace Копирует узел вместе с данными. Копирует узел вместе с данными.
XmlWhitespace Копирует узел вместе с данными. Копирует узел вместе с данными.
XmlDeclaration Копирует цель и значение данных из импортируемого узла. Копирует цель и значение данных из импортируемого узла.
Все остальные типы узлов Эти типы узлов импортировать нельзя. Эти типы узлов импортировать нельзя.

Примечание.

Хотя узлы DocumentType можно импортировать, у документа может быть только один узел DocumentType. Поэтому после импорта типа документа, перед вставкой его в дерево, необходимо убедиться, что в документе нет типа документа. Дополнительные сведения об удалении узлов см. в статье Удаление узлов, содержимого и значений из XML-документа.

См. также