使用XmlWriter创建XML文件

8
我在使用XmlWriter中的Create方法时遇到了问题。即使我使用msdn上的示例,它也无法正常工作。http://msdn.microsoft.com/en-us/library/kcsse48t.aspx 我创建了一个“空白页”项目,用于Windows商店应用程序。我在其中插入了来自msdn的示例代码,以测试XmlWriter类的工作方式。
VS给我报错:
Cannot resolve method 'Create(string)', candidates are: 
System.Xml.XmlWriter Create(System.IO.Stream) (in class XmlWriter)
System.Xml.XmlWriter Create(System.IO.TextWriter) (in class XmlWriter)
System.Xml.XmlWriter Create(System.Text.StringBuilder) (in class XmlWriter)
System.Xml.XmlWriter Create(System.Xml.XmlWriter) (in class XmlWriter)

在控制台应用程序中,这个代码没有问题。但我需要创建一个Windows商店应用程序。

我的目标是向现有的xml文件添加内容。

有人可以告诉我为什么这个代码不起作用,或者如何用其他方式实现我的目标吗?

谢谢您的时间。

编辑:

抱歉,这是我的代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Xml;
using System.Xml.Linq;
using Windows.Data.Xml.Dom;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

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


        private void button_submit_Click(object sender, RoutedEventArgs e)
        {
            using (XmlWriter writer = XmlWriter.Create("output.xml"))
            {
                writer.WriteStartElement("book");
                writer.WriteElementString("price", "19.95");
                writer.WriteEndElement();
                writer.Flush();
            }
        }
    }
}

2
and full error message - Vladimirs
抱歉,我添加了我的代码。 - Morten Toudahl
我的水晶球告诉我,您可能忘记添加“using System.Xml;” - Renatas M.
感谢回复。对于缺乏的信息我很抱歉,这是我的第一篇帖子。我现在已经添加了整个项目的代码。这只适用于控制台应用程序吗? - Morten Toudahl
这里有一个谜团。你能添加你的代码截图和构建错误吗? - Renatas M.
显示剩余2条评论
5个回答

4
这是一个Windows Store应用程序,不是吗?编辑您的问题标签并尝试以下操作:
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("output.xml", CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream writeStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
  System.IO.Stream s =  writeStream.AsStreamForWrite();
  System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
  settings.Async = true;
  using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(s, settings))
  {
    // Do stuff...

    await writer.FlushAsync();
  }
}

你可以在确定它可行后删除命名空间限定符。
请查看 此处 了解有关如何在 Windows 应用商店应用中存储文件的信息。还可以查看 此处 获取示例。我的代码将使用本地应用程序文件夹,即类似于:C:\Users\[name]\AppData\Local\Packages\[appName]\LocalState\

是的,这是一个 Windows 应用商店应用程序。我只使用了大约一个月的 C#,所以我不知道它有什么区别。另外,您的解决方案似乎有效。但是,没有文件显示出来。在“代码”//执行操作“代码”区域中,我插入了来自 MSDN 示例的“代码”writer.WriteStartElement`代码” stuff。 - Morten Toudahl
文件将存储在您的本地存储文件夹中,例如 "C:\Users\[name]\AppData\Local\Packages\[appName]\LocalState"。 - Patrice Gahide
我已经更新了我的答案,包括有关Windows Store应用程序中文件存储的链接。 - Patrice Gahide
根本就不存在。一个朋友刚告诉我无法将xml文件保存到根文件夹,并向我提供了有关StorageFolder类的信息。我认为,当我修复要保存的位置时,它可以使你的代码正常工作。感谢您的帮助。 - Morten Toudahl
@MortenToudahl,我在之前的评论中关于文件位置犯了一个错误,我已经更新了它。 - Patrice Gahide

1
这可能会有帮助,
 using (XmlWriter writer = XmlWriter.Create("employees.xml"))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("Employees");

        foreach (Employee employee in employees)
        {
        writer.WriteStartElement("Employee");

        writer.WriteElementString("ID", employee.Id.ToString());   // <-- These are new
        writer.WriteElementString("FirstName", employee.FirstName);
        writer.WriteElementString("LastName", employee.LastName);
        writer.WriteElementString("Salary", employee.Salary.ToString());

        writer.WriteEndElement();
        }

        writer.WriteEndElement();
        writer.WriteEndDocument();
    }

谢谢你的建议。然而,这给我带来了完全相同的结果。你是在控制台应用程序中进行测试吗? - Morten Toudahl
是的,在控制台应用程序中它可以平稳运行,尝试使用这个:XmlTextWriter w = new XmlTextWriter("test.xml", Encoding.UTF8); w.WriteStartElement("root"); w.WriteAttributeString("xmlns", "x"); w.WriteStartElement("item1"); w.WriteEndElement(); w.WriteStartElement("item2"); w.WriteEndElement(); 或者使用这个链接:http://stackoverflow.com/questions/24615574/windows-8-store-app-xmlwriter-does-not-write-anything-to-file - Mysterion
Patrice Gahide提供的答案是完全正确的。 - Mysterion

1

尝试在button_submit_Click方法中使用以下稍作更改的代码,无需 using。对我来说有效:

XmlWriter writer = XmlWriter.Create("output.xml"));
writer.WriteStartElement("book");
writer.WriteElementString("price", "19.95");
writer.WriteEndElement();
writer.Flush();

谢谢您的建议。然而,这给了我完全相同的结果。您是在控制台应用程序中进行测试吗? - Morten Toudahl
不行。让我试一下,然后告诉你。 - Giannis Grivas
我尝试了一个控制台应用程序,构建成功了。你用的是什么框架?Visual Studio吗? - Giannis Grivas
Visual Studio Ultimate 2013 带有 ReSharper 8。 - Morten Toudahl
我的整个MainPage代码文件都在我的原始帖子中。你不能从那里获取吗? - Morten Toudahl
是的。MainPage.xaml - 它包含一个按钮。 - Morten Toudahl

1
因为你写道:我已经创建了一个"空白页面"的项目,用于Windows商店应用程序。 问题在于,在可移植类库.NET for Windows Store apps中不支持该方法。如果你比较文档中Create(Stream)Create(string)版本信息,你会发现Create(string)在你选择的框架中不受支持。

我能纠正这个问题吗?如果可以,怎么做? - Morten Toudahl

0
在Visual Studio中,转到“视图”菜单并选择“对象浏览器”。
在左侧窗格中查找“System.Xml”,然后导航到以下内容。
1. System.Xml
    - System.Xml
       - XmlWriter

现在点击 XmlWriter,右侧面板将显示该类型的所有方法。查找 Create 方法,看看有哪些重载可用。你应该会看到像我一样的 Create(string)。如果没有,那么说实话,我不确定发生了什么。可能是你使用了不同的 .NET Framework,比如可移植类库之类的???
编辑:
你可以直接使用 using (XmlWriter writer = XmlWriter.Create("output.xml", new XmlWriterSettings()))
这样至少你可以继续你的工作。

实际上,我没有看到Create(String)。我有.NET 4.5和4.5.1。 - Morten Toudahl
谢谢您的建议,但是 using (XmlWriter writer = XmlWriter.Create("output.xml", new XmlWriterSettings())) 与我的原始代码一样会出现相同的错误。 - Morten Toudahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接