2012-06-01 4 views
0

Im Добавление некоторых узлов в существующий XML, находящийся в изолированном хранилище.Добавить узел в существующий 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 Какие находится в Isolatedstorage.

У меня нет Issue Чтобы добавить главный корневой узел Как и Histories Но как я могу писать с XMLTextWritter Mean Как Добавлю Истории корневого узла с 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(); 

ответ

1

Привет, наконец, я изменил эту вещь с помощью Йемена и некоторых моих R & D на этом.

Вот мой фрагмент кода, который работает для меня ...

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

Какой может быть то, что вы хотите.

+0

Является Там Любой другой способ сделать это ?? –

+0

Я уверен, что есть много других способов. Но способ, которым вы хотите (наличие двух узлов 'History' на верхнем уровне), является недопустимым XML. Если вы хотите иметь недопустимый XML, вы можете просто написать в конец потока файлов, но я думаю, что это плохая идея класса. – yamen

Смежные вопросы