【问题标题】:Edit XML file in Windows Store app在 Windows 应用商店应用中编辑 XML 文件
【发布时间】:2015-12-06 14:19:26
【问题描述】:

我正在 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文件:

【问题讨论】:

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


【解决方案1】:

这可能是正确的方法(未在 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>

【讨论】:

  • 什么都没有发生,已经用你的替换了我的 if 条件代码。
【解决方案2】:

您不能在此处保存您的 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());
        }
    }

【讨论】:

    【解决方案3】:

    在控制台应用程序中编写此代码,但它仍然适用于 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>
    

    您的原始代码与您想要的非常接近。您使用了“XAttribute”而不是“XElement”。这不是问题,但输出应该是这样的......

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

    【讨论】:

    • 上面已经提到 xdoc.Save(); 在 Windows 商店中不起作用。虽然它确实可以在 Windows 窗体或控制台中工作。
    • 它抛出这个异常之前已经尝试过了..An exception of type 'System.ArgumentException' occurred in mscorlib.dll but was not handled in user code WinRT information: The specified path (fav.xml) is not an absolute path, and relative paths are not permitted. Additional information: The parameter is incorrect. If there is a handler for this exception, the program may be safely continued.
    • 请参阅:msdn.microsoft.com/en-us/library/windows/apps/hh967755.aspx 如果这有帮助,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多