我正在尝试将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>
我甚至不明白为什么,我无法调试这个。 有什么想法吗?
答案 0 :(得分:1)
这里至少有两件事是错的。
首先,你不能保存自己的想法。
doc = XDocument.Load(fileStream).Descendants("signals").ToList();
此处,doc
是signals
元素的列表。
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);
}