在Windows应用商店应用中编辑XML文件

时间:2015-12-06 14:19:27

标签: c# xml windows-store-apps xmldocument

我正在Windows商店中创建一个应用程序,并且在创建的xml文件中编写xml时遇到问题。 我已经按照 Editing XML file in Windows Store App 进行了操作,但它对我没用。

我希望在点击按钮时在我的xml文件中写入此xml。

这种东西的替代方式..

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

我当前的文件是:

   <?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>

以下是我的尝试:

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 ..**
            }



        }




    }
}

我已经有了如上所述的xml文件:

3 个答案:

答案 0 :(得分:4)

这可能是正确的方法(没有在Windows商店项目中测试)。注意添加到哪个父元素的元素以及分配给哪个元素的内部文本,即原始代码不正确的位置(我很感激努力):

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);

以下是在线演示(基于控制台的应用)的链接:https://dotnetfiddle.net/oElYWJ

输出

<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>

答案 1 :(得分:3)

您无法在此处保存XML文档。应用包中的所有文件都是只读的。您必须将xml文档保存到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());
        }
    }

答案 2 :(得分:2)

在控制台应用程序中写了这个,但它仍应适用于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");

输出:

<?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>

您的原始代码非常接近您想要的。您使用了&#39; XAttribute&#39;而不是&#39; XElement&#39;。这不是一个问题,但输出看起来像这样......

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

您的实际问题是保存。 XDoucment.Save接受流,文本编写器,xml编写器或字符串。在这个例子中,我使用了字符串路径。点击此处:https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument(v=vs.110).aspx

编辑:尝试使用文件流:

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