Заставить XmlDocument сохранить пустые элементы с явным закрывающим тегом

2

У меня есть следующий код:

string PathName = "C:\\Users\\TestUser\\Documents\\Project";
string FileName = "settings.xml";

XmlDocument Settings = new XmlDocument(); 
Settings.Load(Path.Combine(PathName, FileName));

XmlNode KnowledgeNode = Settings.SelectSingleNode("/Config/Map/Knowledge");

XmlNode UsersNode = Settings.CreateNode(XmlNodeType.Element, "Users", null);
XmlAttribute FileDirectory = Settings.CreateAttribute("FileDirectory");
FileDirectory.Value = UserSelectedFileDirectory;
UsersNode.Attributes.Append(FileDirectory);
KnowledgeNode.AppendChild(UsersNode);

Settings.Save(Path.Combine(PathName, FileName));

Это приводит к тому, что мой XML файл содержит <Users FileDirectory="C:\data"/> вместо <Users FileDirectory="C:\data" ></Users> как я хочу.

Как создать конечный элемент? Я дал ему Google, и я не могу найти много. Любая помощь приветствуется, спасибо.

Теги:
xmldocument

1 ответ

5
Лучший ответ

Вот три способа заставить XmlDocument.Save вывести отдельный конечный тег для пустого XmlElement вместо пустого самозакрывающегося тега.

Способ 1

Вставьте пустой элемент пробела внутри элемента:

UsersNode.AppendChild(Settings.CreateWhitespace(""));

Здесь вывод:

<Users FileDirectory="C:\data"></Users>

Способ 2

Установите для свойства XmlElement.IsEmpty элемента значение false:

((XmlElement)UsersNode).IsEmpty = false;

Обратите внимание, что с помощью этого метода стандартные параметры форматирования XML будут вставлять разрыв строки между начальным тегом и конечным тегом. Здесь вывод:

<Users FileDirectory="C:\data">
</Users>

Способ 3

Выведите собственный XmlTextWriter, который переадресует все вызовы WriteEndElement в WriteFullEndElement:

public class CustomXmlTextWriter : XmlTextWriter
{
    public CustomXmlTextWriter(string fileName)
        : base(fileName, Encoding.UTF8)
    {
        this.Formatting = Formatting.Indented;
    }

    public override void WriteEndElement()
    {
        this.WriteFullEndElement();
    }
}

Использование:

using (var writer = new CustomXmlTextWriter(Path.Combine(PathName, FileName)))
{
    Settings.Save(writer);
}

Этот метод может потребовать меньше кода в целом, если в документе имеется много пустых элементов.

Как и в случае с методом 2, параметры форматирования XML по умолчанию будут вставлять разрыв строки между начальным тегом и конечным тегом каждого пустого элемента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню