xml XDocument保存修改文件

时间:2017-02-06 22:49:49

标签: c# xml linq xelement

我正在尝试将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>

我甚至不明白为什么,我无法调试这个。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这里至少有两件事是错的。

首先,你不能保存自己的想法。

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元素。这就解释了为什么您在“新”文档的开头看到了signals

其次,你没有截断你要写的文件。这就是为什么你在signals元素结束后看到一些乱码的原因 - 这就是原来文件中的内容,你刚刚覆盖了它的第一部分。您可能希望查看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);
}