我目前正在尝试创建一些代码以附加到我的XML文件,它将首先检查文件是否已创建以及是否已创建;然后它会打开文件准备好追加。
但问题是,我在最后一行收到上述错误消息。如果我在此行之前放入existingFile.Close(),则错误消失;但随后数据不会附加。
有人可以帮助我。
如果有人愿意的话,我可以给出完整的代码,但我只是暂时给出了一个错误。
代码
if (System.IO.File.Exists(FullPath))
{
found = true;
System.IO.FileStream existingFile = System.IO.File.OpenWrite(FullPath);
existingFile.Seek(-endtag.Length, System.IO.SeekOrigin.End);
writer = new System.Xml.XmlTextWriter(FullPath, System.Text.Encoding.UTF8);
}
答案 0 :(得分:0)
以下代码有效,但有一些注意事项。
首先,它假设元素之间没有任何换行符。也就是说,XML就像:
<RootNode><Element></Element></RootNode>
而不是
<RootNode>
<Element>
</Element>
</RootNode>
如果您使用换行符等缩进XML,那么当您减去根节点的长度时,您也必须减去换行符。如果您希望在一般情况下使用它,您还必须检查尾随空白区域。但是如果你知道文件的最后一个字符是结束标记中的>
,那么下面的代码就可以了。
我有点失望,我必须关闭该文件,然后致电File.AppendText
添加结束标记,但我无法想到更好的方法。除非你经常打这件事,否则不应该成为一个大问题。
private const string EndTag = "</RootNode>";
private void AppendXmlFile()
{
using (var fs = File.OpenWrite(XmlFilename))
{
fs.Seek(-EndTag.Length, SeekOrigin.End);
var settings = new XmlWriterSettings {OmitXmlDeclaration = true};
using (var writer = XmlWriter.Create(fs, settings))
{
writer.WriteStartElement("xyzzy");
writer.WriteAttributeString("magic", "plugh");
writer.WriteEndElement();
}
}
// Now write the end tag
File.AppendAllText(XmlFilename, EndTag);
}
请注意,我告诉XmlWriter
省略XML声明。否则,最终会插入一个新的XML标题(即<?xml ...>
)。
顺便说一下,我使用了XmlWriter而不是XmlTextWriter。正如XmlTextWriter
的文档所说:
从.NET Framework 2.0开始,我们建议您改用System.Xml.XmlWriter类。
我发现它是一个更干净,更易于使用的界面。