强制 XmlDocument 保存带有显式结束标记的空元素

Force XmlDocument to save empty elements with an explicit closing tag

我有以下代码:

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.Save 为空的 XmlElement 输出单独的结束标记,而不是空的自闭合标记。

方法一

在元素中插入一个空白节点:

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

这是输出:

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

方法二

设置元素的XmlElement.IsEmpty 属性为false:

((XmlElement)UsersNode).IsEmpty = false;

请注意,使用此方法时,默认 XML 格式设置会在开始标记和结束标记之间插入一个换行符。这是输出:

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

方法三

派生自定义 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 格式设置会在每个空元素的开始标记和结束标记之间插入一个换行符。