我有点问题。我尝试使用以下代码在XML中添加元素:
using (IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!myStore.FileExists("categorie_settings.xml"))
{
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("categorie_settings.xml", FileMode.Create, myStore))
{
XNamespace _name = "";
XDocument new_doc = new XDocument(
new XDeclaration("1.0", "utf-8", ""),
new XElement(_name + "Root",
new XElement("Row",
new XElement("Nome", query.FirstOrDefault().Nome.ToString()),
new XElement("Tipo", query.FirstOrDefault().Tipo.ToString()),
new XElement("URL", query.FirstOrDefault().URL.ToString()),
new XElement("Err", "Errore1")
)));
new_doc.Save(myStream);
}
}
else
{
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("categorie_settings.xml", FileMode.Open, myStore))
{
XDocument doc1 = XDocument.Load(myStream);
doc1.Element("Root").Add(
new XElement("Row",
new XElement("Nome", query.FirstOrDefault().Nome.ToString()),
new XElement("Tipo", query.FirstOrDefault().Tipo.ToString()),
new XElement("URL", query.FirstOrDefault().URL.ToString()),
new XElement("Err", "Errore2")));
doc1.Save(myStream);
}
}
在第二个使用中我想要一个项目添加到XML文件,但是2调用后的结果是:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Row>
<Nome>Homepage</Nome>
<Tipo>News</Tipo>
<URL>/web/ansait_web_rss_homepage.xml</URL>
<Err>Errore1</Err>
</Row>
</Root><?xml version="1.0" encoding="utf-8"?>
<Root>
<Row>
<Nome>Homepage</Nome>
<Tipo>News</Tipo>
<URL>/web/ansait_web_rss_homepage.xml</URL>
<Err>Errore1</Err>
</Row>
<Row>
<Nome>Cronache</Nome>
<Tipo>News</Tipo>
<URL>/web/notizie/rubriche/cronaca/cronaca_rss.xml</URL>
<Err>Errore2</Err>
</Row>
</Root>
似乎在整个文件加上新元素之前添加到文件中。我怎样才能添加元素?
答案 0 :(得分:0)
为错误的开始道歉(删除)。这是一个片段,可以进入你的例子中的第二个using语句。注意我们如何选择第一个Row元素(firstRow)然后选择AddBeforeSelf。这假设您希望新元素位于列表顶部。
// See update, below, for corrected version
XDocument doc1 = XDocument.Load( myStream );
var root = doc1.Element( "Root" );
var rows = root.Descendants( "Row" );
var firstRow = rows.First();
firstRow.AddBeforeSelf(
new XElement( "Row",
new XElement( "Nome", "Homepage2" ),
new XElement( "Tipo", "News2" ),
new XElement( "URL", "/web/xml2" ),
new XElement( "Err", "Errore2" ) ) );
doc1.Save( myStream );
更新:正如OP在评论中指出的那样,他希望附加新元素,而不是前缀。此外,他在后续调用中获得异常。该异常是由于XDocument.Save(Stream stream)附加到流中,因此您最终会在文件中使用两个XML文档(而不是格式良好的XML)。以下内容解决了这两个问题。
XDocument doc1;
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream( "categorie_settings.xml", FileMode.Open, myStore ))
{
doc1 = XDocument.Load( myStream );
}
var root = doc1.Element( "Root" );
var rows = root.Descendants( "Row" );
var lastRow = rows.Last();
lastRow.AddAfterSelf(
new XElement( "Row",
new XElement( "Nome", "Homepage2" ),
new XElement( "Tipo", "News2" ),
new XElement( "URL", "/web/xml2" ),
new XElement( "Err", "Errore2" ) ) );
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream( "categorie_settings.xml", FileMode.Create, myStore ))
{
doc1.Save( myStream );
}
在创建文件的流上完成保存,从而覆盖以前的文件。或者,您可以使用XDocument.Save(String filename)来替换文件的内容。