C# 将节点添加到隔离存储中的现有XML

C# 将节点添加到隔离存储中的现有XML,c#,xml,silverlight,windows-phone-7,isolatedstorage,C#,Xml,Silverlight,Windows Phone 7,Isolatedstorage,我正在向隔离存储中的现有XML添加一些节点 using (Stream stream = myIsolatedStorage.OpenFile("History.xml", FileMode.Open, FileAccess.ReadWrite)) { XDocument loadedData = XDocument.Load(stream);

我正在向隔离存储中的现有XML添加一些节点

 using (Stream stream = myIsolatedStorage.OpenFile("History.xml", FileMode.Open, FileAccess.ReadWrite))
                        {
                           XDocument loadedData = XDocument.Load(stream);

                            var RootNode = new XElement("History");
                            var RecipentN = new XElement("RecipentName", "ABC");
                            var RecipentNo = new XElement("RecipentNumber", "ABABAB");
                            var Time = new XElement("TimeStamp", "Monday");
                            var MessageBody = new XElement("Message", "23");
                            RootNode.Add(RecipentN, RecipentNo, Time, MessageBody);
                            loadedData.Root.Add(RootNode);
                            loadedData.Save(stream);
                        }
                    }
我希望我的XML是这样的

<?xml version="1.0" encoding="utf-8"?>
<History>
  <RecipentName>Arslan</RecipentName>
  <RecipentNumber>03336329631</RecipentNumber>
  <TimeStamp>123456</TimeStamp>
  <Message>ABC</Message>
</History

<History>
  <RecipentName>Arslanaa</RecipentName>
  <RecipentNumber>03336329631</RecipentNumber>
  <TimeStamp>123456</TimeStamp>
  <Message>ABC</Message>
</History

您的目标XML无效,因为没有根节点。在同一级别上有两个
History
节点

如果您很高兴拥有一个新的根目录(比如
历史记录
),您可以这样做:

// load original XML from the stream
XDocument loadedData = XDocument.Load(stream);

// create a new parent XML structure (new root) and load the original nodes
var newXml = new XDocument(new XElement("Histories"));
newXml.Root.Add(loadedData.Root);

// create the new node
var NewNode = new XElement("History");
var RecipentN = new XElement("RecipentName", "ABC");
var RecipentNo = new XElement("RecipentNumber", "ABABAB");
var Time = new XElement("TimeStamp", "Monday");
var MessageBody = new XElement("Message", "23");
NewNode.Add(RecipentN, RecipentNo, Time, MessageBody);  

// add the new node
newXml.Root.Add(NewNode);

// save the stream
newXml.Save(stream);
这将为您提供:

<Histories>
  <History>
    <RecipentName>Arslan</RecipentName>
    <RecipentNumber>03336329631</RecipentNumber>
    <TimeStamp>123456</TimeStamp>
    <Message>ABC</Message>
  </History>
  <History>
    <RecipentName>ABC</RecipentName>
    <RecipentNumber>ABABAB</RecipentNumber>
    <TimeStamp>Monday</TimeStamp>
    <Message>23</Message>
  </History>
</Histories>

阿尔斯兰
03336329631
123456
基础知识
基础知识
阿巴巴
星期一
23

这可能正是你想要的。

嗨,在也门的帮助下,我终于解决了这个问题,我在这方面进行了一些研发

这是我的代码片段,适合我

if (!myIsolatedStorage.FileExists("History.xml"))
                {
                    using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("History.xml", FileMode.Create, myIsolatedStorage))
                    {
                        XmlWriterSettings settings = new XmlWriterSettings();
                        settings.Indent = true;
                        using (XmlWriter writer = XmlWriter.Create(isoStream, settings))
                        {
                            writer.WriteStartElement("History", "");
                            writer.WriteStartElement("SmSHistory", "");

                            writer.WriteStartElement("RecipentName", "");
                            writer.WriteString(RecipentName);
                            writer.WriteEndElement();

                            writer.WriteStartElement("RecipentNumber", "");
                            writer.WriteString(RecipentNumber);
                            writer.WriteEndElement();

                            writer.WriteStartElement("TimeStamp", "");
                            writer.WriteString(TimeStamp);
                            writer.WriteEndElement();

                            writer.WriteStartElement("Message", "");
                            writer.WriteString(Message);
                            writer.WriteEndElement();

                            // Ends the document
                            writer.WriteEndDocument();

                            // Write the XML to the file.
                            writer.Flush();
                        }
                    }
                }

                else
                {
                    XDocument loadedData;
                    using (Stream stream = myIsolatedStorage.OpenFile("History.xml", FileMode.Open, FileAccess.ReadWrite))
                    {
                        // Load History.xml From Isolated Storage
                        loadedData = XDocument.Load(stream);

                        // Add SMS History Tags to XMLDocument
                        var RootNode = new XElement("SmSHistory");
                        var RecipentN = new XElement("RecipentName", RecipentName);
                        var RecipentNo = new XElement("RecipentNumber", RecipentNumber);
                        var Time = new XElement("TimeStamp", TimeStamp);
                        var MessageBody = new XElement("Message", Message);
                        RootNode.Add(RecipentN, RecipentNo, Time, MessageBody);

                        // Find Root Element And Descedents and Append New Node After That
                        var root = loadedData.Element("History");
                        var rows = root.Descendants("SmSHistory");
                        var lastRow = rows.Last();
                        lastRow.AddAfterSelf(RootNode);
                    }

                    // Save To History.xml File 
                    using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("History.xml", FileMode.Create, myIsolatedStorage))
                    {
                        loadedData.Save(myStream);
                    }
                }
            }

还有其他方法吗?我相信还有很多其他方法。但是您想要的方式(在顶层有两个
History
节点)是无效的XML。如果您想要有无效的XML,您可以只写到文件流的末尾,但我认为这是一个糟糕的主意。
<Histories>
  <History>
    <RecipentName>Arslan</RecipentName>
    <RecipentNumber>03336329631</RecipentNumber>
    <TimeStamp>123456</TimeStamp>
    <Message>ABC</Message>
  </History>
  <History>
    <RecipentName>ABC</RecipentName>
    <RecipentNumber>ABABAB</RecipentNumber>
    <TimeStamp>Monday</TimeStamp>
    <Message>23</Message>
  </History>
</Histories>
if (!myIsolatedStorage.FileExists("History.xml"))
                {
                    using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("History.xml", FileMode.Create, myIsolatedStorage))
                    {
                        XmlWriterSettings settings = new XmlWriterSettings();
                        settings.Indent = true;
                        using (XmlWriter writer = XmlWriter.Create(isoStream, settings))
                        {
                            writer.WriteStartElement("History", "");
                            writer.WriteStartElement("SmSHistory", "");

                            writer.WriteStartElement("RecipentName", "");
                            writer.WriteString(RecipentName);
                            writer.WriteEndElement();

                            writer.WriteStartElement("RecipentNumber", "");
                            writer.WriteString(RecipentNumber);
                            writer.WriteEndElement();

                            writer.WriteStartElement("TimeStamp", "");
                            writer.WriteString(TimeStamp);
                            writer.WriteEndElement();

                            writer.WriteStartElement("Message", "");
                            writer.WriteString(Message);
                            writer.WriteEndElement();

                            // Ends the document
                            writer.WriteEndDocument();

                            // Write the XML to the file.
                            writer.Flush();
                        }
                    }
                }

                else
                {
                    XDocument loadedData;
                    using (Stream stream = myIsolatedStorage.OpenFile("History.xml", FileMode.Open, FileAccess.ReadWrite))
                    {
                        // Load History.xml From Isolated Storage
                        loadedData = XDocument.Load(stream);

                        // Add SMS History Tags to XMLDocument
                        var RootNode = new XElement("SmSHistory");
                        var RecipentN = new XElement("RecipentName", RecipentName);
                        var RecipentNo = new XElement("RecipentNumber", RecipentNumber);
                        var Time = new XElement("TimeStamp", TimeStamp);
                        var MessageBody = new XElement("Message", Message);
                        RootNode.Add(RecipentN, RecipentNo, Time, MessageBody);

                        // Find Root Element And Descedents and Append New Node After That
                        var root = loadedData.Element("History");
                        var rows = root.Descendants("SmSHistory");
                        var lastRow = rows.Last();
                        lastRow.AddAfterSelf(RootNode);
                    }

                    // Save To History.xml File 
                    using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("History.xml", FileMode.Create, myIsolatedStorage))
                    {
                        loadedData.Save(myStream);
                    }
                }
            }