2015-12-06 11 views
7

Tworzę aplikację w sklepie Windows i mając problem z pisaniem xml w utworzonym pliku XML. Podążyłem za tym Editing XML file in Windows Store App, ale to nie zadziałało.Edycja pliku XML w aplikacji Sklep Windows

Chcę, aby ten xml został napisany w moim pliku xml po kliknięciu przycisku.

Wszelkie alternatywny sposób dla tych rzeczy ..

<drink> 
    <drinkImage>ck.png</drinkImage> 
    <drinkTitle>COKE</drinkTitle> 
    <drinkDescription>(1793-1844)</drinkDescription> 
    </drink> 

mój obecny plik jest taka:

<?xml version="1.0" encoding="utf-8" ?> 
    <drinks> 
     <drink> 
     <drinkImage>pepsi.png</drinkImage> 
     <drinkTitle>PEPSI</drinkTitle> 
     <drinkDescription>(1793-1844)</drinkDescription> 
     </drink> 
**<here I Want above xml on button click>** 
    </drinks> 

Oto co próbowałem:

namespace DrinksApp 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class coke : Page 
    { 
     public coke() 
     { 
      this.InitializeComponent(); 

     } 
     XmlDocument dom = new XmlDocument(); 


     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      this.Frame.Navigate(typeof(softdrinks)); 
     } 

     private async void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
       XDocument xmlDoc = XDocument.Load("favourite//fav.xml"); 
     xmlDoc.Root.Add(new XElement("drink", 
        new XAttribute("drinkImage","ck.png"), 
        new XAttribute("drinkTitle","PEPSI"), 
        new XAttribute("drinkDescription","NONE") 

       )); 



xmlDoc.Save(xmlDoc); **//This isn't working in windows store ..** 
      } 



     } 




    } 
} 

Mam już plik xml jako ja ntioned powyżej:

+0

Czy konieczne jest użycie xml? Jest wygodniejszy sposób przechowywania danych w formacie json. – marcinax

+0

faktycznie zaczyna się tutaj scenariusz .. http: // stackoverflow.com/questions/34094405/add-drink-to-favourite-page-on-click-in-windows-store –

Odpowiedz

4

Jest to prawdopodobnie poprawny sposób (nie testowałem w sklepowych projektu). Należy zwrócić uwagę na który element dodany do którego elementem dominującym i co tekst wewnętrzny jest przypisany do którego elementem, czyli gdzie oryginalne kody nieprawidłowo zrobić (Doceniam wysiłek, chociaż):

var existingRoot = dom.DocumentElement; 

var newElement = dom.CreateElement("drink"); 
existingRoot.AppendChild(newElement); 

var drinkImageElement = dom.CreateElement("drinkImage"); 
drinkImageElement.InnerText = "ck.png"; 
newElement.AppendChild(drinkImageElement); 

var drinkTitleElement = dom.CreateElement("drinkTitle"); 
drinkTitleElement.InnerText = "COKE"; 
newElement.AppendChild(drinkTitleElement); 

var drinkDescriptionElement = dom.CreateElement("drinkDescription"); 
drinkDescriptionElement.InnerText = "Nothing"; 
newElement.AppendChild(drinkDescriptionElement); 

Tu jest link do online demo (aplikacje oparte na konsoli): https://dotnetfiddle.net/oElYWJ

wyjściowa:

<drinks> 
    <drink> 
    <drinkImage>pepsi.png</drinkImage> 
    <drinkTitle>PEPSI</drinkTitle> 
    <drinkDescription>(1793-1844)</drinkDescription> 
    </drink> 
    <drink> 
    <drinkImage>ck.png</drinkImage> 
    <drinkTitle>COKE</drinkTitle> 
    <drinkDescription>Nothing</drinkDescription> 
    </drink> 
</drinks> 
+0

nic się nie dzieje, zastąpiłem mój ** kod warunkowy twoim. ** –

+0

** dom.loadxml() ; ** nie akceptuje mojego pliku xml –

2

napisał to w app konsoli, ale powinna nadal pracować dla sklepu z aplikacjami Windows.

 XDocument xdoc = XDocument.Load("fa.xml"); 

     xdoc.Root.Add(new XElement("drink", 
      new XElement("drinkImage", "Img.png"), 
      new XElement("drinkTitle", "NewDrink"), 
      new XElement("drinkDescription", "HelloWorld"))); 

     xdoc.Save("fa.xml"); 

wyjściowa:

<?xml version="1.0" encoding="utf-8"?> 
<drinks> 
    <drink> 
    <drinkImage>pepsi.png</drinkImage> 
    <drinkTitle>PEPSI</drinkTitle> 
    <drinkDescription>(1793-1844)</drinkDescription> 
    </drink> 
    <drink> 
    <drinkImage>Img.png</drinkImage> 
    <drinkTitle>NewDrink</drinkTitle> 
    <drinkDescription>HelloWorld</drinkDescription> 
    </drink> 
</drinks> 

Twój oryginalny kod jest bardzo zbliżony do tego, co chcieliśmy. Użyłeś "XAttribute" zamiast "XElement". To nie jest problem, ale wyjście wyglądałoby tak ...

<drink drinkImage="ck.png" drinkTitle="PEPSI" drinkDescription="NONE" /> 

Twoim rzeczywistym problemem było zapisanie. XDoucment.Save akceptuje strumień, pisarz tekstowy, program piszący xml lub ciąg znaków. W tym przykładzie użyłem ścieżki łańcuchowej. Zobacz więcej tutaj: https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument(v=vs.110).aspx

EDIT: Spróbuj użyć filestream:

var xmlFile = await StorageFile.GetFileFromPathAsync("fav.xml"); 
using (var fileStream = await xmlFile.OpenStreamForWriteAsync()) 
{ 
    xdoc.Save(fileStream); 
} 
+0

Wspomniałem wyżej, że ** xdoc.Save(); ** nie działa w sklepie Windows. , podczas gdy działa w formie okna lub konsoli. –

+0

Spróbuj użyć strumienia plików, zobacz moją edycję powyżej. –

+0

rzuca ten wyjątek próbowałem tego wcześniej .. 'Wystąpił wyjątek typu" System.ArgumentException "w pliku mscorlib.dll, ale nie został obsłużony w kodzie użytkownika Informacje WinRT: Podana ścieżka (fav.xml) nie jest ścieżka bezwzględna, a ścieżki względne nie są dozwolone. Dodatkowe informacje: Parametr jest niepoprawny. Jeśli istnieje wyjątek dla tego wyjątku, program może być bezpiecznie kontynuowany. " –

3

Nie można zapisać dokumentu XML tutaj. Wszystkie pliki z pakietu aplikacji są tylko do odczytu. Musisz zapisać swój dokument xml w localState:

public async Task DoJobAsync() 
    { 
     XDocument xmlDoc = XDocument.Load("favourite//fav.xml"); 
     xmlDoc.Root.Add(new XElement("drink", 
        new XAttribute("drinkImage", "ck.png"), 
        new XAttribute("drinkTitle", "PEPSI"), 
        new XAttribute("drinkDescription", "NONE") 

       )); 
     using (var stream = await (await ApplicationData.Current.LocalFolder.CreateFileAsync("fav.xml")).OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      xmlDoc.Save(stream.AsStreamForWrite()); 
     } 
    } 
Powiązane problemy