C# 将节点添加到隔离存储中的现有XML
我正在向隔离存储中的现有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);
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);
}
}
}