代码之家  ›  专栏  ›  技术社区  ›  user3277335

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

  •  5
  • user3277335  · 技术社区  · 9 年前

    我有以下代码:

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

    <Users FileDirectory="C:\data" /> 而不是 <Users FileDirectory="C:\data" ></Users> 如我所愿。

    1 回复  |  直到 9 年前
        1
  •  14
  •   Michael Liu    9 年前

    这里有三种强制XmlDocument的方法。保存以输出空XmlElement的单独结束标记,而不是空的自动关闭标记。

    方法1

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

    以下是输出:

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

    方法2

    XmlElement.IsEmpty 元素的属性

    ((XmlElement)UsersNode).IsEmpty = false;
    

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

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

    派生一个自定义XmlTextWriter,将所有WriteEndElement调用转发给WriteLendElement:

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