xml XDocument 保存修改文件

xml XDocument Save modify file

我正在尝试将 XElements 添加到 XDocument。我正在尝试从使用 inifile 转移到 xml,但我在这里遇到了一些问题。

这是我的 C# 代码:

public static async Task<List<XElement>> XMLHandling()
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile file = await storageFolder.GetFileAsync("sFile.xml");

            List<XElement> doc;
            using (var fileStream = await file.OpenStreamForReadAsync())
            {
                doc = XDocument.Load(fileStream).Descendants("signals").ToList();
                //avoid range check
                doc[0].Add(new XElement("Character", new XElement("Value", "value1"), new XElement("Description", "This is some text")));
                using (Stream sr = await file.OpenStreamForWriteAsync())
                {
                    doc[0].Save(sr);
                }
            }
            //example
            return doc;
        }

这是文件之前的样子:

<?xml version="1.0"?>
<catalog>
   <signals>

   </signals>

   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
</catalog>

这是之后的样子:

<?xml version="1.0" encoding="utf-8"?>
<signals>
  <Character>
    <Value>value1</Value>
    <Description>This is some text</Description>
  </Character>
</signals>/title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
</catalog>

我什至不明白为什么,也无法调试它。 有什么想法吗?

这里至少有两处错误。

首先,您并没有保存自己的本色。

doc = XDocument.Load(fileStream).Descendants("signals").ToList();

这里,docsignals 个元素的列表。

doc[0].Add(new XElement("Character", new XElement("Value", "value1"), 
    new XElement("Description", "This is some text")));

在这里,您将 Character 元素添加到第一个 signals 元素。

doc[0].Save(sr);

最后,您 只保存 第一个 signals 元素。这就解释了为什么您会在 'new' 文档的开头看到 signals

其次,您没有截断要写入的文件。这就是为什么您在 signals 元素末尾看到一些乱码 XML - 这只是文件中最初的内容,您只是覆盖了它的第一部分。您可能希望查看 this question 以了解一些处理此问题的选项。一种选择是在写入之前将长度设置为零。

所以,像这样:

XDocument doc;

using (var stream = await file.OpenStreamForReadAsync())
{
    doc = XDocument.Load(stream);
}

var signals = doc.Descendants("signals").Single();

signals.Add(new XElement("Character", ...));

using (var stream = await file.OpenStreamForWriteAsync())
{
    stream.SetLength(0);
    doc.Save(stream);
}