[c#]添加到根 XElement 在 XDocument 的子元素

标签: Linq XML C#
发布时间: 2017/2/28 22:55:36
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图将节点添加到 XML 文件与 XDocument.Load 中的根元素。问题是,它 reapeats 头当我添加一个新节点。 在这里是要创建的 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>

解决方法 1:

这并不与 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);  
}

最好的解决办法是重新打开流。不定位,当文件收缩后,你会有其他的问题。

大致上,注意 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);  
}
赞助商