2011-10-31 81 views
1

我有一点问题。我尝试在XML与此代码添加一个元素:将元素添加到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> 

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

回答

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)替换文件的内容。

+0

第一个和第二个节点相反,但问题仍然存在。实际上,当我输入第三个元素时会生成一个异常,因为它找到两个语句。 –

+0

如果要在Row元素末尾添加元素,只需将“var firstRow - rows.First();”与“var lastRow = rows.Last();”和“firstRow.AddBeforeSelf(...”与“lastRow.AddAfterSelf(...”。 –

+0

至于异常,你得到的是因为XDocument.Save(Stream)将新形成的文档追加到(看看自己看到的结果流)如果使用XDocument.Save(字符串文件名),它会覆盖现有的文件,这就是您要查找的行为 –