Парсинг XML [Решено]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Парсинг XML [Решено]

Сообщение seaman 16 апр 2011, 16:28

Вопрос к спецам.
Есть такой атрибут offset="0 37"
тут в одном атрибуте два значения - по x и по y.
Стандартный майкрософтовский XmlTextReader при чтении такого атрибута выбрасывает исключение "Multiple document element was detected".

Как я понял - нестандартный XML-ский атрибут? Или что-то не еще не то? Можно ли такой атрибут читать?

Скрипт подобный:
Синтаксис:
Используется csharp
        if (File.Exists(path))
        {
            StreamReader r = File.OpenText(path);
            try
            {
                XmlTextReader reader = new XmlTextReader(r) { WhitespaceHandling = WhitespaceHandling.None };
                while (reader.Read())
                {
                    if (reader.Name == "Font")
                    {
                        string a = reader.GetAttribute("texturesize");
                         atr = a.Split(' ');
                         Size stex = new Size(Int32.Parse(atr[0]), Int32.Parse(atr[1]));
                         CustomFont newFont = new CustomFont(reader.GetAttribute("family"), reader.GetAttribute("texturename"),
                         Int32.Parse(reader.GetAttribute("size")), Int32.Parse(reader.GetAttribute("height")), reader.GetAttribute("style"), stex);
                         while (reader.Read() && reader.Name == "Char")
                         {
                            atr = reader.GetAttribute("rect").Split(' ');
                            Rect pos = new Rect(Int32.Parse(atr[0]), Int32.Parse(atr[1]), Int32.Parse(atr[2]), Int32.Parse(atr[3]));
                            atr = reader.GetAttribute("offset").Split(' ');
                            Point of = new Point(Int32.Parse(atr[0]), Int32.Parse(atr[1]));
                            ChrDesc chr = new ChrDesc(reader.GetAttribute("code").ToCharArray()[0], pos, of, Int32.Parse(reader.GetAttribute("width")));
                            newFont.AddChar(chr);
                        }
                        CustomFonts.AddFont(newFont);
                    }
                }
                reader.Close();
            }
            catch (XmlException e)
            {
                Debug.Log("error occured: " + e.Message);
            }
            finally
            {
                r.Close();
            }
Последний раз редактировалось seaman 16 апр 2011, 19:17, всего редактировалось 1 раз.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Парсинг XML

Сообщение gnoblin 16 апр 2011, 18:59

я думаю что xml нужно считывать совсем по-другому (полная Ж)

Пример есть здесь
viewtopic.php?f=18&t=1837&p=15876
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Парсинг XML

Сообщение seaman 16 апр 2011, 19:15

Тот случай хорош, если сам делаешь XML файл, сам его потом читаешь. У меня XML генерит другая прога, переписывать его так, чтобы понял XmlSerializer будет сложнее, чем прочитать вручную самому. Хотя я все же попробую - может если слегка переопределить мой класс все и пойдет. Спасибо за наводку...

А ошибка была в другом - файл для эксперимента я все же несколько подкорректировал, точнее взял не сгенерированный прогой, а сам написал. Сделал ошибку - два элемента одного уровня вложенности, что не допускается. Файл сгенерированный прогой читается нормально. Так что в принципе все работает, но попробовать вариант по ссылке нужно - там проще...
Последний раз редактировалось seaman 16 апр 2011, 20:12, всего редактировалось 2 раз(а).
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Парсинг XML [Решено]

Сообщение gnoblin 16 апр 2011, 19:54

я достаточно часто "подбираю" класс для десериализации конфига который генерит другая прога, думаю что это вполне прикольный способ :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Парсинг XML [Решено]

Сообщение seaman 16 апр 2011, 20:12

Хм. А во что можно десериализовать список элементов? Типа:
<Char width="13" offset="0 37" rect="1 44 1 1" code=" "/>
<Char width="14" offset="2 -3" rect="2 4 10 41" code="!"/>

В Dictionary не хочет... Hashtable тоже. Может только в массив. Это уже очень неудобно.

Следующее. ВСЕ типы переменных, используемые в сериализуемых классах должны иметь конструктор без параметров явно заданный. Это решаемо, но опять дополнительная работа.

Следующее. Не знаю как работает у чела по ссылке, а у меня требует нечто типа: "InvalidOperationException: <Font xmlns=''> was not expected" в ReadRoot. Ну и, естественно, не работает. Решение этого уже потребует корректировки начального xml.

Так что я пока буду работать по старинке - вручную парсить...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Парсинг XML [Решено]

Сообщение gnoblin 16 апр 2011, 21:52

List<>

Следующее. ВСЕ типы переменных, используемые в сериализуемых классах должны иметь конструктор без параметров явно заданный. Это решаемо, но опять дополнительная работа.

да вроде не обязательно.

Понятно что иногда нужно удалить какую-нить мерзкую строчку из xml-ки перед тем как десериализовать ее в объект класс.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Парсинг XML [Решено]

Сообщение gnoblin 16 апр 2011, 21:56

Я так понимаю это xml-ка которая получается на выходе тулзы которая из ttf файлика шрифта генерит текстурный атлас с заданным набором символов и файл с описанием.
У меня этот компонент для трехмерного гуи работает без "ручного" парсинга.

Я считаю что ручной парсинг это мега-непродуктивно, но каждый имеет право извращаться как ему больше нравится :D.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Парсинг XML [Решено]

Сообщение seaman 16 апр 2011, 22:38

да вроде не обязательно.

Ну у меня ругалось на все типы переменных в классе что нет дефолтного конструктора...
Я так понимаю это xml-ка которая получается...

Да, она..

Ну вот мне удобнее работать с Dictionary, а не с массивом. Значит после десериализации нужно преобразовывать массив в словарь...
Мне удобно держать в описании шрифта ссылку на текстуру. Из-за того, что Texture2D не имеет конструктора без параметров, десериализоваться наотрез отказывалось. Значит мне пришлось бы убрать ее из класса и каждый раз искать текстуру по имени - неудобно...
Ну и главное - почему-то потребовало явного определения пространства имен (xmlns=). Разбираться с этим мне что-то совсем не хотелось...

Конечно, если бы все с ходу заработало, может я и ушел бы с ручного парсинга. Ну а так - мой вариант уже работает, зачем мучаться...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29