在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中将子元素添加到根XElement

这与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方法(如果新文件比原始文件小,后一个选项可能会留下不需要的文本)。