【问题标题】:Force XmlDocument to save empty elements with an explicit closing tag强制 XmlDocument 使用显式结束标记保存空元素
【发布时间】:2017-12-29 10:37:31
【问题描述】:

我有以下代码:

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>

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

【问题讨论】:

    标签: c# .net xml xmldocument


    【解决方案1】:

    这里有三种方法可以强制 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>
    

    方法3

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2018-05-05
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多