【问题标题】:Add Node To Existing XML in isolated storage将节点添加到隔离存储中的现有 XML
【发布时间】:2012-06-03 00:33:07
【问题描述】:

我正在向隔离存储中的现有 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 中

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

任何人都可以帮助我如何连接到隔离存储中的现有 XML。

我没有问题添加像历史一样的主根节点,但是我如何使用 XMLTextWritter 编写意味着我将如何使用 Writer 添加历史根节点

                    writer.WriteStartElement("History", "");

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

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

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

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

                    // Ends the document
                    writer.WriteEndDocument();
                    writer.flush();

【问题讨论】:

    标签: c# xml silverlight windows-phone-7 isolatedstorage


    【解决方案1】:

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

    如果你很高兴拥有一个新的根(比如Histories),你可以这样做:

    // 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>
    

    这可能是你想要的。

    【讨论】:

    • 还有其他方法吗??
    • 我相信还有很多其他的方法。但是您想要的方式(在顶层有两个 History 节点)是无效的 XML。如果你想要无效的 XML,你可以写到文件流的末尾,但我认为这是一个坏主意。
    【解决方案2】:

    嗨,我终于在也门和我的一些研发的帮助下完成了这件事。

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

    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);
                        }
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多