为什么XML元素未附加在文件末尾

时间:2012-05-05 11:25:58

标签: xml silverlight windows-phone-7 isolatedstorage

我试图将一个元素添加到IsolatedStorage中的XML文件中,但不是在根目录中添加它,而是复制文件并在最后添加:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <lampe id="1" nom="lampe1" content="Tables" header="Lampes de la cuisine" adresse="A1" />
    <lampe id="2" nom="lampe2" content="Porte et garage" header="Lampe du jardin" adresse="C3" />
</root><?xml version="1.0" encoding="utf-8"?>
<root>
    <lampe id="1" nom="lampe1" content="Tables" header="Lampes de la cuisine" adresse="A1" />
    <lampe id="2" nom="lampe2" content="Porte et garage" header="Lampe du jardin" adresse="C3" />
    <child attr="1">data1</child>
</root>

这是我使用的代码:

_xdoc = new XDocument();

using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
    using (IsolatedStorageFileStream isoStore = new IsolatedStorageFileStream("lampes.xml", FileMode.Open, store))
    {
        _xdoc = XDocument.Load(isoStore);
        int nextNumber = _xdoc.Element("root").Elements("lampe").Count() + 1;

        XElement newChild = new XElement("lampe", "data" + nextNumber);
        newChild.Add(new XAttribute("attr", nextNumber));
        _xdoc.Element("root").Add(newChild);

        _xdoc.Save(isoStore);
    }
}

我在这里失踪了什么?

2 个答案:

答案 0 :(得分:1)

读取和写入同一个文件并不是一个好主意。您的XML 构造正确,只是编写错误。

应该使用的一种方法是将文件写入其他位置(例如"lampe_tmp.xml"),使用IsolatedStorageFileDeleteFile API关闭并删除原始"lampe.xml" ,然后使用MoveFile API将"lampe_tmp.xml"复制到"lampe.xml"

using (IsolatedStorageFileStream isoStore = new IsolatedStorageFileStream("lampes_tmp.xml", FileMode.Open, store)) {
    // the code from your post that modifies XML goes here...
}
IsolatedStorageFile.DeleteFile("lampes.xml");
IsolatedStorageFile.MoveFile("lampes_tmp.xml", "lampes.xml");

答案 1 :(得分:0)

您正在写入您从中读取的同一个流。当你开始写文件时,文件位置将位于文件的末尾,因此它将附加到文件中。

在写入之前重置流的位置,或者关闭流并打开一个新的流进行写入。