Добавить элемент в XML-файл в IsolatedStorage - PullRequest
1 голос
/ 31 октября 2011

У меня маленькая проблема.Я пытаюсь добавить элемент в 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>

Похоже, что добавляет к файлу перед всем файлом плюс новый элемент.Как я могу сделать просто добавить элемент?

1 Ответ

0 голосов
/ 01 ноября 2011

Извинения за фальстарт (удалено).Вот фрагмент, который вошел бы во второй оператор использования в вашем примере.Обратите внимание, как мы выбираем первый элемент 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 );

Обновлен: поскольку ОП указывает на комментарии, он хотел, чтобы новый элемент был добавлен, а не добавлен.Кроме того, он получает исключение при последующих вызовах.Это исключение связано с добавлением 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), который заменяет содержимое файла.

...