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();
这里,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
元素。这就解释了为什么您会在 '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);
}
我正在尝试将 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();
这里,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
元素。这就解释了为什么您会在 '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);
}