В настоящее время я пытаюсь создать некоторый код для добавления в мой XML файл, он сначала проверяет, создан ли файл и если он есть; он откроет файл, готовый для добавления.
Но проблема в том, что я получаю указанное выше сообщение об ошибке на последней строке. Если я поставлю существующийFile.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);
}
Ниже приведен код, но с несколькими предостережениями.
Во-первых, он предполагает, что между элементами нет новых линий. То есть, 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.
Я считаю, что это более чистый и простой в использовании интерфейс.
FullPath
(имя файла) в конструкторXmlTextWriter
, когда я думаю, что вы хотите передатьexistingFile
файл (поток). Это, вероятно, заставит код работать, но в итоге вы получите неверный XML.