#c# #xml
#c# #xml
Вопрос:
У меня есть некоторый код, который редактирует и XML-файл. Когда я сохраняю файл, новые элементы не имеют правильного отступа, в то время как существующие элементы, например:
До того, как:
<MyGroup>
<ExistingElement1>a value</ExistingElement1>
<ExistingElement2>something else</ExistingElement2>
</MyGroup>
После:
<MyGroup>
<ExistingElement1>a value</ExistingElement1>
<ExistingElement2>something else</ExistingElement2>
<NewElement>Inserted by code</NewElement></MyGroup>
Новые элементы добавляются с помощью XElement, например:
myGroup.Add(new XElement(ns "NewElement", "Inserted by code"));
при сохранении файла я использую XmlWriterSettings, поскольку хочу избежать сохранения XmlDeclaration:
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = true,
Encoding = Encoding.UTF8,
Indent = true
};
using (var writer = XmlWriter.Create(filePath, settings))
{
xmlDoc.Save(writer);
}
Похоже, что Indent = true
опция не работает для вновь добавленных элементов, кто-нибудь знает почему?
Кстати, когда я открываю файл, который я использую LoadOptions.PreserveWhitespace
XDocument xmlDoc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace);
Комментарии:
1. Нет никакой разницы между старыми и новыми элементами, как только они все туда попадают. Может показаться, что он делает отступ, но не с тем количеством пробелов, которое вы ожидаете. Пусть он удалит пробелы между старыми узлами, чтобы посмотреть, что произойдет.
2. Еще не тестировался, но, вероятно
LoadOptions.PreserveWhitespace
,<NewElement>
причина<MyGroup>
будет идентифицирована как имеющая смешанный контент , т. Е. Как дочерние элементы, так и текстовое содержимое. И из документов : элементы имеют отступы до тех пор, пока элемент не содержит смешанного содержимого. Как только метод WriteString или WriteWhitespace вызывается для записи содержимого смешанного элемента, XmlWriter прекращает делать отступы.3. Вам не хватает: настройки. Отступ = true;
4. @jdweng — это прямо там:
var settings = new XmlWriterSettings{ /* ... */ Indent = true }
5. @Techromancer — тогда вам нужно будет вручную вставить
XText
узлы, соответствующие нужному отступу<NewElement>
. Смотрите также docs.microsoft.com/en-us/dotnet/standard/linq /… и docs.microsoft.com/en-us/dotnet/standard/linq /…