我正在尝试使用XDocument.Load将节点添加到XML文件中的根元素。问题是,当我添加一个新节点时,它会重新写入标题。 以下是创建XML文件的功能:
private void createDoc()
{
XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("Items", new XComment("Here will be added new nodes")));
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoStore.FileExists("positions2.xml"))
{
Debug.WriteLine("File Exists!!!");
isoStore.DeleteFile("positions.xml");
}
else
{
using (IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream("positions2.xml", FileMode.Create, isoStore))
{
doc.Save(isoStream);
}
}
}
}
从这里一切看起来都很好,输出还可以:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Items>
<!--Here will be added new nodes-->
</Items>
要将子节点添加到根节点,我使用此函数:
private void AppendToXMLFile(string reg, string butname, int oldposition, int newposition)
{
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("positions2.xml", FileMode.Open, isoStore))
{
XDocument doc = XDocument.Load(isoStream);
var newElement = new XElement("channel",
new XElement("region", reg),
new XElement("name", butname),
new XElement("oldposition", oldposition),
new XElement("newpostions", newposition));
doc.Element("Items").Add(newElement); //add node to root node
doc.Save(isoStream, SaveOptions.OmitDuplicateNamespaces);
}
}
}
这是调用AppendToXMLFile
函数后的输出:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Items>
<!--Here will be added new nodes-->
</Items><?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Items>
<!--Comment to prevent <Items />-->
<channel>
<region>test</region>
<name>test1</name>
<oldposition>6</oldposition>
<newpostions>0</newpostions>
</channel>
</Items>
答案 0 :(得分:2)
这与XDocument操作无关(它们没问题),但是您将新文件追加到旧文件中。
问题的相关部分:
using (IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream("positions2.xml", FileMode.Open, isoStore))
{
// A: read it and leave Strean.Position at the end
XDocument doc = XDocument.Load(isoStream);
... // add Elements
// B: write the new contents from the last Position (behind the original)
doc.Save(isoStream, SaveOptions.OmitDuplicateNamespaces);
}
最好的解决方案是重新打开Stream。不要重新定位,当文件稍后缩小时,您将遇到其他问题。
粗略地说,请注意FileMode值:
XDocument doc;
using (IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream("positions2.xml", FileMode.Read, isoStore))
{
doc = XDocument.Load(isoStream);
}
... // add Elements
using (IsolatedStorageFileStream isoStream =
new IsolatedStorageFileStream("positions2.xml", FileMode.Create, isoStore))
{
doc.Save(isoStream, SaveOptions.OmitDuplicateNamespaces);
}
答案 1 :(得分:0)
该问题根本与此代码的Xml部分无关!您正在使用相同的Stream来读取和写入文件,因此在加载xml之后,文件光标位于文件的末尾。 在修改doc.Save方法之前,使用isoStream.SetLength(0)或isoStream.Seek(0,SeekOrigin.Begin)修复此尝试(如果新文件小于原始文件,后一选项可能会留下不需要的文本)。