我有以下代码:
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>
。
如何创建结束元素?我给它一个谷歌,我找不到多少。感谢任何帮助。谢谢。
答案 0 :(得分:7)
以下三种方法可以强制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>
派生一个自定义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);
}
如果文档中有很多空元素,则此方法可能需要更少的代码。
与方法2一样,默认的XML格式设置将在每个空元素的开始标记和结束标记之间插入换行符。