Сохранение пробела при загрузке или синтаксическом анализе XML (LINQ to XML)

В этой статье описывается, как управлять поведением пробелов LINQ to XML.

Типичным сценарием является чтение отступа XML, создание дерева XML в памяти без каких-либо текстовых узлов пробелов (т. е. без сохранения пробелов), выполнение некоторых операций с XML, а затем сохранение XML с отступом. При сериализации XML с форматированием сохраняются только значимые пробелы XML-дерева. Это поведение по умолчанию для LINQ to XML.

Другой типичный сценарий заключается в чтении и изменении XML с уже существующими преднамеренными отступами. Эти отступы ни в коем случае изменять нельзя. Для этого в LINQ to XML следует сохранять пробелы при загрузке или анализе XML и отключении форматирования при сериализации XML.

В этой статье описывается поведение пробелов методов, заполняющих xml-деревья. Сведения об управлении пробелами при сериализации XML-деревьев см. в разделе "Сохранение пробелов при сериализации".

Поведение методов, заполняющих xml-деревья

Следующие методы в классах XElement и XDocument заполняют XML-дерево. XML-дерево можно заполнить из файла, объекта TextReader, объекта XmlReader или строки:

Если метод не принимает LoadOptions в качестве аргумента, метод не сохранит незначительные пробелы.

В большинстве случаев, если метод принимает объект LoadOptions в качестве аргумента, позволяет сохранять незначащие пробелы в XML-дереве как текстовые узлы. Однако если метод загружает XML из объекта XmlReader, то объект XmlReader определяет, будут ли сохраняться пробелы или нет. Задание параметра PreserveWhitespace не оказывает никакого воздействия.

Если при использовании этих методов сохраняются незначащие пробелы, то вставляются в XML-дерево как узлы XText. Если пробел не сохраняется, текстовые узлы не вставляются.

XML-дерево можно создать при помощи объекта XmlWriter. Узлы, которые записываются в XmlWriter, вставляются в дерево. Однако при построении XML-дерева при помощи этого метода сохраняются все методы, независимо от того, содержит ли узел пробел или нет, является ли пробел значащим или нет.