Изменение узлов, содержимого и значений в XML-документе

Существует множество способов изменения узлов и содержимого в документе. Вы можете:

  • изменять значение узлов с помощью свойства Value;

  • изменять набор узлов в целом, заменяя узлы новыми. Это делается с помощью свойства InnerXml;

  • заменять существующие узлы новыми с помощью метода RemoveChild;

  • добавлять в узлы дополнительные символы, наследующие от класса XmlCharacterData, используя методы AppendData, InsertData или ReplaceData;

  • изменять содержимое путем удаления диапазона символов с помощью метода DeleteData для типов узлов, наследующих от XmlCharacterData.

Изменить значение узла можно с помощью простого приема node.Value = "new value";. В следующей таблице перечислены типы узлов, в которых работает эта строка кода, и указано, какие данные изменяются для этого типа узла.

Тип узла Изменяемые данные
Атрибут Значение атрибута.
CDATASection. Содержимое CDATASection.
Комментарий Содержимое комментария.
ProcessingInstruction; Содержимое, за исключением цели.
Текст Содержимое текстового узла.
XmlDeclaration Содержимое декларации, за исключением разметки <?xml и ?>.
Пробел Значение символа пробела. В качестве значения можно задать один из четырех различаемых в XML пробельных символов: пробел, табуляция, CR или LF.
SignificantWhitespace Значение значащих пробелов. В качестве значения можно задать один из четырех различаемых в XML пробельных символов: пробел, табуляция, CR или LF.

Типы узлов, не представленные в таблице, являются недопустимыми для установки значений. При установке значения в узле такого типа вызывается исключение InvalidOperationException.

Свойство InnerXml изменяет разметку дочерних узлов текущего узла. Задание этого свойства замещает дочерние узлы значением заданной строки, содержимое которой прошло синтаксический анализ. Синтаксический анализ выполняется в контексте текущего пространства имен. Кроме того, свойство InnerXml удаляет избыточные декларации пространств имен. В результате после многочисленных операций вырезания и вставки размер документа не будет увеличиваться за счет избыточных деклараций пространств имен. Пример кода, демонстрирующий влияние пространств имен на работу InnerXml, см. в свойстве InnerXml.

Использование методов ReplaceData и RemoveChild возвращает замещенный или удаленный узел. Затем этот узел можно повторно вставить в другом месте модели XML DOM. Метод ReplaceData выполняет двойную проверку узла, вставляемого в документ. Первая проверка обеспечивает то, что узел становится дочерним для узла, который может иметь дочерние узлы такого типа. Вторая проверка обеспечивает то, что вставляемый узел не является предком узла, для которого он становится дочерним. Несоблюдение любого из этих условий вызывает исключение InvalidOperationException.

Допустимо добавлять дочерний узел, доступный только для чтения, в узел, поддерживающий изменение, или удалять из него. Однако при попытке изменить сам узел, доступный только для чтения, вызывается исключение InvalidOperationException. Примером может служить изменение потомков узла XmlEntityReference. Потомки доступны только для чтения, и их нельзя изменить. Любая попытка изменить вызывает исключение InvalidOperationException.

См. также