在IsolatedStorage中将元素添加到XML文件

时间:2011-10-31 17:09:23

标签: c# xml linq windows-phone-7 isolatedstorage

我有点问题。我尝试使用以下代码在XML中添加元素:

using (IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!myStore.FileExists("categorie_settings.xml"))
                {
                    using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("categorie_settings.xml", FileMode.Create, myStore))
                    {
                        XNamespace _name = "";
                        XDocument new_doc = new XDocument(
                                new XDeclaration("1.0", "utf-8", ""),
                                new XElement(_name + "Root",
                                    new XElement("Row",
                                        new XElement("Nome", query.FirstOrDefault().Nome.ToString()),
                                        new XElement("Tipo", query.FirstOrDefault().Tipo.ToString()),
                                        new XElement("URL", query.FirstOrDefault().URL.ToString()),
                                        new XElement("Err", "Errore1")
                                        )));


                        new_doc.Save(myStream);

                    }
                }
                else
                {

                    using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("categorie_settings.xml", FileMode.Open, myStore))
                    {
                        XDocument doc1 = XDocument.Load(myStream);
                        doc1.Element("Root").Add(
                            new XElement("Row",
                                new XElement("Nome", query.FirstOrDefault().Nome.ToString()),
                                new XElement("Tipo", query.FirstOrDefault().Tipo.ToString()),
                                new XElement("URL", query.FirstOrDefault().URL.ToString()),
                                new XElement("Err", "Errore2")));


                        doc1.Save(myStream);




                    }



                }

在第二个使用中我想要一个项目添加到XML文件,但是2调用后的结果是:

    <?xml version="1.0" encoding="utf-8"?>
<Root>
  <Row>
    <Nome>Homepage</Nome>
    <Tipo>News</Tipo>
    <URL>/web/ansait_web_rss_homepage.xml</URL>
    <Err>Errore1</Err>
  </Row>
</Root><?xml version="1.0" encoding="utf-8"?>
<Root>
  <Row>
    <Nome>Homepage</Nome>
    <Tipo>News</Tipo>
    <URL>/web/ansait_web_rss_homepage.xml</URL>
    <Err>Errore1</Err>
  </Row>
  <Row>
    <Nome>Cronache</Nome>
    <Tipo>News</Tipo>
    <URL>/web/notizie/rubriche/cronaca/cronaca_rss.xml</URL>
    <Err>Errore2</Err>
  </Row>
</Root>

似乎在整个文件加上新元素之前添加到文件中。我怎样才能添加元素?

1 个答案:

答案 0 :(得分:0)

为错误的开始道歉(删除)。这是一个片段,可以进入你的例子中的第二个using语句。注意我们如何选择第一个Row元素(firstRow)然后选择AddBeforeSelf。这假设您希望新元素位于列表顶部。

// See update, below, for corrected version

XDocument doc1 = XDocument.Load( myStream );
var root = doc1.Element( "Root" );
var rows = root.Descendants( "Row" );
var firstRow = rows.First();
firstRow.AddBeforeSelf(
      new XElement( "Row",
          new XElement( "Nome", "Homepage2" ),
          new XElement( "Tipo", "News2" ),
          new XElement( "URL", "/web/xml2" ),
          new XElement( "Err", "Errore2" ) ) );
doc1.Save( myStream );

更新:正如OP在评论中指出的那样,他希望附加新元素,而不是前缀。此外,他在后续调用中获得异常。该异常是由于XDocument.Save(Stream stream)附加到流中,因此您最终会在文件中使用两个XML文档(而不是格式良好的XML)。以下内容解决了这两个问题。

XDocument doc1;
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream( "categorie_settings.xml", FileMode.Open, myStore ))
{
    doc1 = XDocument.Load( myStream );
}

var root = doc1.Element( "Root" );
var rows = root.Descendants( "Row" );
var lastRow = rows.Last();
lastRow.AddAfterSelf(
      new XElement( "Row",
          new XElement( "Nome", "Homepage2" ),
          new XElement( "Tipo", "News2" ),
          new XElement( "URL", "/web/xml2" ),
          new XElement( "Err", "Errore2" ) ) );

using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream( "categorie_settings.xml", FileMode.Create, myStore ))
{  
  doc1.Save( myStream );
}

在创建文件的流上完成保存,从而覆盖以前的文件。或者,您可以使用XDocument.Save(String filename)来替换文件的内容。