Копирование существующих узлов из одного документа в другой
Метод 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-документа.