Время выполнения создания XML в c # и сохранения данных - PullRequest
0 голосов
/ 07 марта 2012

Попытка создать динамический XML-файл и сохранить в нем данные, однако я могу сохранить последнюю запись, а не все записи. Есть мысли?

Чтобы создать файл XML с необходимыми узлами:

GenerateXML ()

            XmlDocument doc = new XmlDocument();
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(docNode);

            XmlNode albums = doc.CreateElement("albums");
            doc.AppendChild(albums);

            XmlNode album = doc.CreateElement("album");
            albums.AppendChild(album);

            XmlNode title = doc.CreateElement("title");
            albums.AppendChild(title);

            doc.Save(System.Windows.Forms.Application.StartupPath + "\\albums.xml");

Вывод от нажатия кнопки дает мне либо 10 записей, либо 100 записей, либо некоторое количество записей:

 //album is a class returned by web service
if (Elements.Count > 0)
                {

             string path = System.Windows.Forms.Application.StartupPath + "\\albums.xml";
                //Read the file stream in read mode
                FileStream READER = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

                System.Xml.XmlDocument albumSpecs = new System.Xml.XmlDocument();
                albumSpecs.Load(READER);

                FileStream WRITER = null; 

                GenerateXML();

                //Create a FileStream for writing
                WRITER = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);


                XmlElement root = doc.DocumentElement;
                XmlNodeList nodes = root.SelectNodes("//albums");
                for (int i = 0; i < ResultsList.Items.Count - 1; i++)
                {
                    album = (Album)ResultsList.Items[i]; 
                    foreach (XmlNode node in nodes)
                    {
                        node["title"].InnerText = album.Title;

                    }

                }
                //Write the data to the filestream
                doc.Save(WRITER);
            }

Я получаю данные последней записи в XML, а не все возвращенные записи.

<?xml version="1.0" encoding="UTF-8"?>
<albums>
  <album />
  <title>She will be loved</title>
</albums>

Как построить XML времени выполнения на основе количества возвращенных записей?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Сначала загрузите уже сохраненный XML в XmlDocument, а затем добавьте в него новые элементы ...

GenerateXML ()

string xmlFilePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "albums.xml");

        XmlDocument doc = new XmlDocument();
        XmlNode albums = null;

        if (!File.Exists(xmlFilePath))
        {
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(docNode);
            albums = doc.CreateElement("albums");
            doc.AppendChild(albums);
        }
        else
        {
            doc.Load(xmlFilePath);
            albums = doc.ChildNodes[1];
        }

        XmlNode album = doc.CreateElement("album");
        albums.AppendChild(album);

        XmlNode albumName = doc.CreateElement("name");
        album.AppendChild(albumName);


        XmlNode title = doc.CreateElement("title");
        album.AppendChild(title);

        doc.Save(xmlFilePath);
0 голосов
/ 07 марта 2012

Попробуйте добавить элементы в ваш XML-документ?

for (int i = 0; i < ResultsList.Items.Count - 1; i++)
            {
                album = (Album)ResultsList.Items[i]; 
                foreach (XmlNode node in nodes)
                {
                    node["title"].InnerText = album.Title;

                }

            }

Этот пример кода не очень эффективен, потому что у вас есть только один элемент для итерации ...

Редактировать: я думаю, вы хотите сделать что-то вроде этого:

for(int i = 0; i < ResultsList.Items.count -1; i++)
    {
         XmlNode child = doc.createElement("Title");
         doc.AppendChild .....
    }
doc.save;
...