强制XmlDocument使用显式的闭合标签保存空元素

5

I have the following code:

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>
我该如何创建结束元素?我已经在谷歌上搜索了很多,但没有找到太多信息。任何帮助都将不胜感激,谢谢。
1个回答

15

以下是三种方法,可以强制XmlDocument.Save在空的XmlElement元素中输出单独的结束标签而不是一个空的自闭合标签。

方法1

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

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);
}

如果您的文档中有许多空元素,则此方法可能需要更少的代码。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接