2014-02-19 66 views
-1

我正嘗試在C#中爲我的Windows Phone 8應用程序編輯本地xml文件。 在網絡上,我發現無數的例子使用XmlDocument使用方法AppendChild。 在Windows Phone 8中,XmlDocument已被XDocument取代,AppendChild消失。 我嘗試下面的代碼,但得到protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)一些錯誤: 可以看到這裏的錯誤:http://i811.photobucket.com/albums/zz38/JelleK1996/cerror1_zpsb6aa5398.png在C#中編輯Xml文件(WP8)

任何人都可以幫我嗎?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Navigation; 
using Microsoft.Phone.Controls; 
using Microsoft.Phone.Shell; 
using XmlLocalEdit1.Resources; 
using System.Xml; 
using System.Xml.Linq; 
using System.Text; 

namespace XmlLocalEdit1 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

      // Sample code to localize the ApplicationBar 
      //BuildLocalizedApplicationBar(); 
     } 
     protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
     { 
      try 
      { 
       StringBuilder sb = new StringBuilder(); 
       XmlWriterSettings xws = new XmlWriterSettings(); 
       xws.OmitXmlDeclaration = true; 
       xws.Indent = true; 

       using (XmlWriter xw = XmlWriter.Create(sb, xws)) 
       { 
        XDocument xdoc = XDocument.Load("Resources/bar.xml"); 
        XElement xmlTree = new XElement("data", 
         new XElement("cocktail", 
          new XElement("name", "Dreamsicle"), 
          new XElement("id", 1) 
         ) 
        ); 
        xdoc.Add(xmlTree); 
        xdoc.Save(xw); 
       } 

       //xdoc.Add(xmlTree); 
       //xdoc.Save("Resources/bar.xml", SaveOptions.None); 

      } 
      catch (Exception myExc) 
      { 
       Console.WriteLine(myExc.Message); 
      } 
     } 

     /*private static XElement CreateCocktail(XDocument xmlDoc, 
               string name, 
               int id) 
     { 
      var xmlCocktail = xmlDoc 
     }*/ 
    } 
} 

XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <cocktail> 
    <name>43 Hedonism</name> 
    <id>14</id> 
    </cocktail> 
    <cocktail> 
    <name>B-52</name> 
    <id>4</id> 
    </cocktail> 
</data> 
+0

'我想下面的代碼,但得到的保護覆蓋void'一些錯誤 - 什麼是'某些error'? – DGibbs

+0

添加了錯誤鏈接:http://i811.photobucket.com/albums/zz38/JelleK1996/cerror1_zpsb6aa5398.png – JelleKerkstra

+1

您的xml文件位於何處?看起來,就像它在Resources中一樣,我不確定,你可以在windows-phone中編輯文件。如果你想編輯這個文件,你應該將它複製到獨立的存儲,然後使用該副本。 – Olter

回答

4

好吧,這裏有一個樣本給你。

我強烈建議您使用IsolatedStorage而不是編輯資源中的文件。

  // copy the xml file to isolated storage 
      using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       if (!file.FileExists("bar.xml")) 
       { 
        StreamResourceInfo sr_en = Application.GetResourceStream(new Uri("Resources\\bar.xml", UriKind.Relative)); 
        using (BinaryReader br_en = new BinaryReader(sr_en.Stream)) 
        { 
         byte[] data = br_en.ReadBytes((int)sr_en.Stream.Length); 
         //Write the file. 
         using (BinaryWriter bw = new BinaryWriter(file.CreateFile("bar.xml"))) 
         { 
          bw.Write(data); 
          bw.Close(); 
         } 
        } 
       } 

       // work with file at isolatedstorage 
       using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("bar.xml", FileMode.Open, file)) 
       { 
        XDocument doc = XDocument.Load(stream, LoadOptions.None); 

        // add new node to data section 
        doc.Descendants("data").FirstOrDefault().Add(
         new XElement("cocktail", 
          new XElement("name", "Dreamsicle"), 
          new XElement("id", 1) 
         ) 
        ); 
        // prevent xml file from doubling nodes 
        if (stream.CanSeek) 
         stream.Seek(0, SeekOrigin.Begin); 
        doc.Save(stream); 
       } 
      } 
+0

非常感謝。它的工作! – JelleKerkstra

+0

「意外的XML聲明:XML聲明必須是文檔中的第一個節點,並且不允許空白字符出現在第11行,第10行。將XML文件寫入IsolatedStorage時是否可能添加了字節順序標記?如果是這樣,我怎樣才能輕鬆地刪除它在這個代碼? – JelleKerkstra

+0

@JelleKerkstra,要查看更改後的文件,應該爲Visual Studio使用獨立的存儲瀏覽器擴展(其中有幾個全部免費)。但是,IS瀏覽器被創建爲與真實的手機設備一起工作(給出的屏幕截圖顯示,您正在使用模擬器),因此您可能會遇到一些問題。您收到的錯誤很可能是「<?xml」標籤之前的額外空格或註釋。你什麼時候得到這個錯誤?您可以將手錶添加到doc對象,並檢查它是否在編輯之前和之後具有正確的格式。 – Olter

0

您當前的代碼將另一<data>元素添加到XML文件,導致具有多根元素的XML,其不是有效的XML格式。我想你想添加另一個<cocktail>元素,而不是現有的<data>元素。如果是這種情況,您可以嘗試這種方式:

....... 
XDocument xdoc = XDocument.Load("Resources/bar.xml"); 
XElement xmlTree = new XElement("cocktail", 
     new XElement("name", "Dreamsicle"), 
     new XElement("id", 1) 
    ); 
//add new <cocktail> to existing root, which is <data> element 
xdoc.Root.Add(xmlTree); 
xdoc.Save(xw); 
.......