在XDocument中将子项添加到根XElement

时间:2014-11-07 11:38:12

标签: c# xml linq windows-phone-8

我正在尝试使用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>

2 个答案:

答案 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)修复此尝试(如果新文件小于原始文件,后一选项可能会留下不需要的文本)。