2013-05-27 183 views
1

我试图写在一个XML文件中的一些信息,结构应该是:如何在C#中使用LINQ在XML文件中追加信息?

<Scoreboard> 
<Match> 
    <name>Dummy</name> 
    <score>1234</score> 
</Match> 
<Match> 
    <name>Sample</name> 
    <score>4567</score> 
</Match>  
</Scoreboard> 

的问题是,我只能写一个条目,如果我插入另外的“匹配”的老一个会被覆盖。

举例来说,如果我有:

<Scoreboard> 
<Match> 
    <name>Dummy</name> 
    <score>1234</score> 
</Match> 
</Scoreboard> 

然后我想补充另一个进入旧的将被删除,我只会有新的,例如:

<Scoreboard> 
<Match> 
    <name>Sample</name> 
    <score>4567</score> 
</Match> 
</Scoreboard> 

我会知道如何在不覆盖旧的条目的情况下编写新的条目。

这里是我的代码:

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
//If file doesn't exist, then create it. 

      if (!isoStore.FileExists("scoreboard.xml")) 
      { 
       XDocument doc = new XDocument(new XElement("Scoreboard")); 

       using (IsolatedStorageFileStream isoStream = 
        new IsolatedStorageFileStream("scoreboard.xml", System.IO.FileMode.Create, isoStore)) 
       { 
        doc.Save(isoStream); 
       } 


      } 
      else 
      { 
//Else open it and write a new element which is a child of Scoreboard 
       using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("scoreboard.xml", System.IO.FileMode.Open, isoStore)) 
       { 
        XDocument doc1 = XDocument.Load(isoStream); 

        var newElement = new XElement("Match", 
         new XElement("name", VarGlobal.Name), 
         new XElement("score", VarGlobal.Score)); 

        doc1.Element("Scoreboard").Add(newElement); 

        Messaggio.Text = doc1.ToString(); 
       } 
      } 
     } 
+1

如果该文件存在,您正在加载它并追加一个新值 - 但之后您不再保存它。所以我没有看到文件内容将如何被替换...... –

+0

但是,如果我不保存它,那么当我再次加载它时为什么会看到新的值?我应该如何保存它? –

+0

如果你不保存它,你*不会*看到新的值。你不会。我怀疑问题出在'isoStore.FileExists'中。你应该能够通过调试来看到。 –

回答

1

使用XmlSerializer的是在这种情况下,而不是在XML中用手推动要素更有效。建模您的记分卡对象并使用基本的串行器和解串器。下面的例子应该可以工作(假设你的操作方法被称为SaveXmlValue())。

public class Match 
{ 
    public string Name { get; set; } 
    public string Score { get; set; } 
} 

public class Scorecard 
{ 
    public List<Match> Match { get; set; } 
} 

public static Scorecard DeSerialize(Stream strm) 
{ 
    var ser = new XmlSerializer(typeof(Scorecard)); 
    strm.Seek(0, SeekOrigin.Begin); 
    return (Scorecard)ser.Deserialize(strm); 
} 

public static string Serialize(Scorecard scores) 
{ 
    var ser = new XmlSerializer(typeof(Scorecard)); 
    using (var strm = new MemoryStream()) 
    { 
     var writer = XmlWriter.Create(strm, new XmlWriterSettings() { Indent = true, Encoding = System.Text.Encoding.UTF8 }); 
     ser.Serialize(writer, scores); 
     strm.Seek(0, SeekOrigin.Begin); 
     var bytes = new byte[strm.Length]; 
     strm.Read(bytes, 0, (int)strm.Length); 
     return System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length); 
    } 
} 

public void SaveXmlValue() 
{ 
    Scorecard scores; 
    if (isoStore.FileExists("scoreboard.xml")) 
    { 
     using (IsolatedStorageFileStream isoStream = 
      new IsolatedStorageFileStream("scoreboard.xml", System.IO.FileMode.Open, isoStore)) 
     { 
      scores = DeSerialize(isoStream); 
     } 
    } 
    else 
    { 
     // Xml file doesn't exist, create new score card object 
     scores = new Scorecard(); 
     scores.Match = new List<Match>(); 
    } 

    scores.Match.Add(new Match() { Name = VarGlobal.Name, Score = VarGlobal.Score }); 

    var xml = Serialize(scores); 
    using (IsolatedStorageFileStream isoStream = 
      new IsolatedStorageFileStream("scoreboard.xml", System.IO.FileMode.Create, isoStore)) 
    { 
     var buffer = System.Text.Encoding.UTF8.GetBytes(xml); 
     isoStream.Write(buffer, 0, buffer.Length); 
    } 

} 
+0

非常感谢您的回复!我只有一个问题...当我尝试编译它时,它说:“错误'System.Text.Encoding.GetString(byte [])'由于保护级别而无法访问。” ... 我究竟做错了什么?再次感谢! –

+0

你使用的是什么.Net Framework版本? – loopedcode

+0

我修改了代码以支持GetString方法的通用版本。它现在应该适合你。 – loopedcode