在XDocument中将子元素添加到根XElement
本文关键字:添加 XElement 元素 XDocument | 更新日期: 2023-09-27 18:29:44
我正试图用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>
这与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);
}
该问题与此代码的Xml部分完全无关!您使用相同的Stream来读取和写入文件,因此在加载xml之后,文件光标位于文件的末尾。此操作修复了在调用文档之前尝试使用isoStream.SetLength(0)或isoStream.Seek(0,SeekOrigin.Begin)的问题。Save方法(如果新文件比原始文件小,后一个选项可能会留下不需要的文本)。