强制XmlDocument使用明确的结束标记保存空元素 [英] Force XmlDocument to save empty elements with an explicit closing tag

查看:92
本文介绍了强制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));

这导致我的XML文件包含< Users FileDirectory ="C:\ data"/>

This results in my XML file containing <Users FileDirectory="C:\data" /> instead of <Users FileDirectory="C:\data" ></Users> as I want.

如何创建end元素?我给了它一个Google,但找不到很多.感谢您的任何帮助.

How do I create the end element? I've given it a Google and I can't find much. Any help is appreciated, thanks.

推荐答案

这里有三种强制XmlDocument的方法.保存为空的XmlElement输出一个单独的结束标签,而不是一个空的自闭合标签.

Here are three ways to force XmlDocument.Save to output a separate end tag for an empty XmlElement instead of an empty, self-closing tag.

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

Insert an empty whitespace node inside the element:

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

这是输出:

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

方法2

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

((XmlElement)UsersNode).IsEmpty = false;

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

Note that with this method, the default XML formatting settings will insert a line break between the start tag and the end tag. Here's the output:

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

方法3

派生一个自定义XmlTextWriter,它将所有WriteEndElement调用转发到WriteFullEndElement:

Method 3

Derive a custom XmlTextWriter that forwards all WriteEndElement calls to 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);
}

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

This method might require less code overall if you have a lot of empty elements in your document.

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

As with Method 2, the default XML formatting settings will insert a line break between the start tag and end tag of each empty element.

这篇关于强制XmlDocument使用明确的结束标记保存空元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆