强制XmlDocument使用显式结束标记保存空元素

use*_*335 2 .net c# xml xmldocument

我有以下代码:

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));
Run Code Online (Sandbox Code Playgroud)

这导致我的XML文件包含<Users FileDirectory="C:\data" /> 而不是<Users FileDirectory="C:\data" ></Users>我想要的.

如何创建结束元素?我给它一个谷歌,我找不到多少.任何帮助表示赞赏,谢谢.

Mic*_*Liu 8

以下三种方法强制XmlDocument.Save为空XmlElement而不是空的自闭合标记输出单独的结束标记.

方法1

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

UsersNode.AppendChild(Settings.CreateWhitespace(""));
Run Code Online (Sandbox Code Playgroud)

这是输出:

<Users FileDirectory="C:\data"></Users>
Run Code Online (Sandbox Code Playgroud)

方法2

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

((XmlElement)UsersNode).IsEmpty = false;
Run Code Online (Sandbox Code Playgroud)

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

<Users FileDirectory="C:\data">
</Users>
Run Code Online (Sandbox Code Playgroud)

方法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();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

using (var writer = new CustomXmlTextWriter(Path.Combine(PathName, FileName)))
{
    Settings.Save(writer);
}
Run Code Online (Sandbox Code Playgroud)

如果文档中有很多空元素,则此方法可能需要较少的代码.

与方法2一样,默认的XML格式设置将在每个空元素的开始标记和结束标记之间插入换行符.