Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2010, 02:27   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
Вопрос Чтение из XML документа. Не могу прочесть значение атрибута.

Не могу прочесть из документа значение атрибута "NewsCount", как его прочитать? Помогите пожалуйста, если кто умеет работать с xml документами. ИМХО сложновато для понимания, миллион классов и не ясно какие нужны, а какие мне не пригодятся. Могу ошибаться
Код:
        private void CreateXMLDocument(string filepath)
        {
            XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF8);
            xtw.WriteStartDocument();
            xtw.WriteStartElement("ArhiveNews"); 
            xtw.WriteStartAttribute("NewsCount"); //Количество новостей в файле
            xtw.WriteValue(1); //Сама цифра обозначающая количество новостей в файле, пригодиться при их добавлении
            xtw.WriteEndDocument();
            xtw.Close();
        }
Здесь пытаюсь прочесть атрибут:
Код:
        private void btnLoadNews_Click(object sender, EventArgs e)
        {
            if (File.Exists(ArhiveFileXml))
                    {
                        FileStream fStream = new FileStream(ArhiveFileXml, FileMode.Open);
                        XmlTextReader xmlTextReader = new XmlTextReader(fStream);;
                        String lggg = xmlTextReader.GetAttribute("NewsCount");
                        String lnhg = xmlTextReader.LocalName;
                        xmlTextReader.ReadStartElement("ArhiveNews");
                        String Element = xmlTextReader.ReadElementString("NewsCount");
                    }
                    else
                    {
                        this.CreateXMLDocument(ArhiveFileXml);
                    }
          .......................
          }
Добавляю в документ данные этим методом:
Код:
        /// <summary>
        /// Записать данные новостей в XML документ
        /// </summary>
        /// <param name="filepath">Полный путь к файлу, включая имя файла в который нужно записать данные</param>
        /// <param name="ID">ID номер</param>
        /// <param name="HeaderNews">Заголовок новости</param>
        /// <param name="BodyNews">Текст новости</param>
        private void WriteNewsToXMLDocument(string filepath, int ID, string HeaderNews, string BodyNews)
        {
            XmlDocument xmlDoc = new XmlDocument();
            FileStream fileStream = new FileStream(filepath, FileMode.Open);
            xmlDoc.Load(fileStream);

            // Создаем новую запись News c аттрибутом следующего id   
            XmlElement newsEl = xmlDoc.CreateElement("News");
            newsEl.SetAttribute("id", ID.ToString());
            // Забиваем запись в документ   
            xmlDoc.DocumentElement.AppendChild(newsEl); //<News id="1"> </News>

            XmlElement headerEl = xmlDoc.CreateElement("TextHead");
            XmlText textHeader = xmlDoc.CreateTextNode(HeaderNews);
            headerEl.AppendChild(textHeader);
            newsEl.AppendChild(headerEl);       //<News id="1">
                                                //  <TextHead>Заголовок новости</TextHead>
                                                //</News>
            XmlElement bodyEl = xmlDoc.CreateElement("TextBody");
            XmlText textBody = xmlDoc.CreateTextNode(BodyNews);
            bodyEl.AppendChild(textBody);
            newsEl.AppendChild(bodyEl);

            fileStream.Close();         // Закрываем поток   
            xmlDoc.Save(filepath); // Сохраняем файл   
        }
Содержимое файла из которого хочу прочитать значение атрибута "NewsCount":
Код HTML:
<?xml version="1.0" encoding="utf-8"?>
<ArhiveNews NewsCount="1">
  <News id="1">
    <TextHead>Название темы 1</TextHead>
    <TextBody>1) Тело письма! 
 Спасибо, что выбрали наш продукт!</TextBody>
  </News>
  <News id="2">
    <TextHead>Название темы 2</TextHead>
    <TextBody>2) Тело письма! 
 Спасибо, что выбрали наш продукт!</TextBody>
  </News>
  <News id="3">
    <TextHead>Название темы 3</TextHead>
    <TextBody>3) Тело письма! 
 Спасибо, что выбрали наш продукт!</TextBody>
  </News>
</ArhiveNews>

Последний раз редактировалось Casper-SC; 31.05.2010 в 02:39.
Casper-SC вне форума Ответить с цитированием
Старый 31.05.2010, 08:30   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
[Serializable]
        [XmlRoot("News")]
        public class News
        {
            [XmlAttribute("id")]
            public int Id;

            [XmlElement("TextHead")]
            public string TextHead;

            [XmlElement("TextBody")]
            public string TextBody;
        }

        [Serializable]
        [XmlRoot("ArhiveNews")]
        public class ArhiveNews
        {
            [XmlAttribute("NewsCount")]
            public int NewsCount;

            [XmlIgnore()]
            public List<News> News = new List<News>();
        }
Теперь читаем
Код:
var xml = "<?xml...";

            // загружаем заголовок
            var xs = new XmlSerializer(typeof(ArhiveNews));
            var reader = new StringReader(xml);
            var archiveNews = (ArhiveNews)xs.Deserialize(reader);

            // загружаем все News
            var doc = new XmlDocument();
            doc.LoadXml(xml);
            var news = doc.GetElementsByTagName("News");
            foreach (XmlNode news1 in news)
            {
                var xs1 = new XmlSerializer(typeof(News));
                var reader1 = new StringReader(news1.OuterXml);
                var news2 = (News)xs1.Deserialize(reader1);
                archiveNews.News.Add(news2);
            }

Последний раз редактировалось BOBAH13; 31.05.2010 в 08:32.
BOBAH13 вне форума Ответить с цитированием
Старый 31.05.2010, 11:27   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Спасибо конечно, но можно как то найти способ прочитать именно, то что я записал. ArhiveNews - это по сути просто название, как бы элемент, чтоли в XML называется. NewsCount хранит номер последней новости, чтобы не создавались экземпляры с одинаковыми ID. То есть пользователь удалит ID 1, 2, 3, 7, 10. Останутся 4, 5, 6, 8, 9, 11 Например, то следующая новость добавиться под номером 12, то есть замещаться не будут старые удалённые ID, просто это лишний гемор, а типа int думаю хватит на все новости, которые выйдут за всё существование приложения, ну или можно обнулять в каждой новой версии приложения.

Код:
        private void btnLoadNews_Click(object sender, EventArgs e)
        {
            if (File.Exists(ArhiveFileXml))
                    {
                        FileStream fStream = new FileStream(ArhiveFileXml, FileMode.Open);
                        XmlTextReader xmlTextReader = new XmlTextReader(fStream);;
                        String STR1 = xmlTextReader.GetAttribute("NewsCount");
                        String STR2 = xmlTextReader.LocalName;
                        xmlTextReader.ReadStartElement("ArhiveNews");
                        String Element = xmlTextReader.ReadElementString("NewsCount");
                    }
                    else
                    {
                        this.CreateXMLDocument(ArhiveFileXml);
                    }
          .......................
          }
Вообще в коде выше проблема, там у меня не получается прочитать NewsCount и STR1, STR2 всегда null. Я уже понял, что я не правильно читаю.

Пересмотрел ответ выше, тоже вариант конечно, главное, чтобы после установки новой версии проблем с десериализацией не было. А вообще, если всё же кто нибудь ответит как мне прочитать моим способом, буду рад услышать

===============================
Разобрался в принципе, просто счётчик сообщений теперь добавляю как и новость, ну и методы довёл до ума, всё будет нормально теперь работать, и при удалении список заново строиться, помоему не скончаемая нумерация это всё-таки бред (см. начало этого сообщения).

Последний раз редактировалось Casper-SC; 01.06.2010 в 06:16.
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение XML beemoto Общие вопросы Delphi 19 16.10.2011 11:54
Oracle. Чтение атрибута XML документа shurik_7866 SQL, базы данных 0 23.03.2010 21:38
чтение простейшего XML TaTT DoGG PHP 4 27.08.2009 11:44
XML - создание нового документа PUH Помощь студентам 5 17.04.2008 20:32