Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
1
.NET 4.x

Десериализация XML

27.07.2015, 17:08. Показов 8785. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть XML документ, изменить формат не получится
XML
1
2
3
4
5
6
7
8
<Points>
        <Point IsRequired="1"  X="0" Y="0" Z="0"/>
        <Point IsRequired="1"  X="1" Y="1" Z="0"/>
        <Point IsRequired="0"  X="0" Y="1" Z="1"/>
        <Point IsRequired="0"  X="2" Y="0" Z="0.5"/>
        <Point IsRequired="0"  X="0" Y="3" Z="0.5"/>
        <Point IsRequired="0"  X="12" Y="0" Z="0.5"/>
</Points>
И надо его как то разобрать в список
C#
1
public List<Point> RegularPoints{ get; set; }
Класс Point
C#
1
2
3
4
5
6
7
8
9
10
11
public class Point
{
        [XmlAttribute]
        public Boolean IsRequired { get; set; }
        [XmlAttribute]
        public Double X { get; set; }
        [XmlAttribute]
        public Double Y { get; set; }
        [XmlAttribute]
        public Double X { get; set; }
}
Для этого использую XmlSerializer
Но при попытке десериализовать в List<Point> он пишет что отсутствует корневой элемент.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2015, 17:08
Ответы с готовыми решениями:

Десериализация XML
Есть окошко, которое делает &quot;Вход в систему&quot;. Для входа нужен username, password, они хранятся в...

Десериализация XML
Здравствуйте! Добавлено через 27 секунд Решил(

Десериализация XML
Привет. Прошу дать совет, как мне сериализовать такую XML-ку: какой должен быть класс для: ...

Десериализация XML
Нужна помощь в десериализации XML &lt;rss version=&quot;2.0&quot; xmlns:media=&quot;http://search.yahoo.com/mrss/&quot;...

10
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
27.07.2015, 17:50 2
где то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
[XmlRoot("Point")]
public class Point
{
        [XmlAttribute("IsRequired")]
        public Boolean IsRequired { get; set; }
        [XmlAttribute("X")]
        public Double X { get; set; }
        [XmlAttribute("Y")]
        public Double Y { get; set; }
        [XmlAttribute("Z")]
        public Double Z { get; set; }
}
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.07.2015, 18:06 3
Лучший ответ Сообщение было отмечено Kill100 как решение

Решение

Kill100, ошибка возникает, потому что он ждет корневой элемент ArrayOf%CLASSNAME%. Так как у вас оно другое, то он падает. Исправляется вызовом перегруженного конструктора для сериализатора:
C#
1
var xml = new XmlSerializer(typeof (List<Point>), new XmlRootAttribute("Points"));
всё


пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
 
namespace ConsoleApplication61
{
    class Program
    {
        static void Main(string[] args)
        {
           string s = 
@"<Points>
        <Point IsRequired=""1""  X=""0"" Y=""0"" Z=""0""/>
        <Point IsRequired=""1""  X=""1"" Y=""1"" Z=""0""/>
        <Point IsRequired=""0""  X=""0"" Y=""1"" Z=""1""/>
        <Point IsRequired=""0""  X=""2"" Y=""0"" Z=""0.5""/>
        <Point IsRequired=""0""  X=""0"" Y=""3"" Z=""0.5""/>
        <Point IsRequired=""0""  X=""12"" Y=""0"" Z=""0.5""/>
</Points>";
 
            var xml = new XmlSerializer(typeof (List<Point>), new XmlRootAttribute("Points"));
 
            using (var sr = new StringReader(s))
            {
                var obj = (List<Point>) xml.Deserialize(sr);
 
                Console.WriteLine(obj[0].IsRequired);
            }
 
        }
    }
 
 
    public class Point
    {
        [XmlAttribute]
        public bool IsRequired { get; set; }
        [XmlAttribute]
        public double X { get; set; }
        [XmlAttribute]
        public double Y { get; set; }
        [XmlAttribute]
        public double Z { get; set; }
    }
}
2
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
28.07.2015, 09:32  [ТС] 4
Эм, что то не выходит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 public class Program
    {
        [Serializable]
        public sealed class Point
        {
            [XmlAttribute]
            public String Name { get; set; }
            [XmlAttribute]
            public String Title { get; set; }
            [XmlAttribute]
            public Boolean IsRequired { get; set; }
        }
        static void Main(string[] args)
        {
            String s =
                "<Points>" +
                "<Parameter Name=\"@TopPoint\" Title=\"@TopPoint\"  IsRequired=\"1\" />" +
                "<Parameter Name=\"@BottomPoint\" Title=\"@BottomPoint\"  IsRequired=\"1\" />" +
                "<Parameter Name=\"@Test\" Title=\"@Test\"  IsRequired=\"1\" />" +
                "</Points>";
 
            XmlSerializer serializer = new XmlSerializer(typeof(List<Point>), new XmlRootAttribute("Points"));
            var memoryStream = new MemoryStream(StringToUtf8ByteArray(s));
            serializer.Deserialize(memoryStream);
 
        }
        // Метод конвертирует строку в UTF8 Byte массив
        private static Byte[] StringToUtf8ByteArray(string xmlString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            var byteArray = encoding.GetBytes(xmlString);
            return byteArray;
        }
    }
Количество элементов в списке 0
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
28.07.2015, 12:50 5
Цитата Сообщение от Kill100 Посмотреть сообщение
Количество элементов в списке 0
разные источники данных и не подготовленный класс для сериализации.
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
28.07.2015, 14:34  [ТС] 6
Цитата Сообщение от tvv1 Посмотреть сообщение
азные источники данных и не подготовленный класс для сериализации.

Не по теме:

А как подготовить его было слабо сказать?
Не знаешь не пиши.
Я с XML работаю очень редко, раз в год и то если повезёт. По работе все данные хранятся в json.

0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.07.2015, 18:02 7
Kill100, ну так переименуйте класс Point в Parameter
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
28.07.2015, 19:21 8
Цитата Сообщение от Kill100 Посмотреть сообщение
C#
1
2
3
4
5
static void Main(string[] args)
{
String s =
"<Points>" +
"<Parameter
в коде произошли изменения источника данных, от описанных в условии.
для данных в условии, предоставил соответствующий класс.

После изменения Point на Parameter в данных, необходимо так же поменять сам класс с такими же изменениями.
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
28.07.2015, 22:59  [ТС] 9
А где можно почитать как именно работает XML десериализатор...
Что то не втуплю почему такие странные правки..
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
29.07.2015, 14:35 10
Kill100,
на счет почитать не знаю, но для того что бы получать данные из XML файла, просмотрел следующие видео:
XML Serialization and Deserialization in C#
C# Xml Serialization
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.07.2015, 19:24 11
Kill100, а в чем странность? Он ожидает, что класс будет называться так же, как и нода. А у вас класс назван по-одному (Point), а нода - Parameter. Естественно он падает. Это можно переопределить через XmlType (по-моему этот атрибут, там много атрибутов Xml%SOMETGING% есть, можете сами посмотреть), но обычно проще соблюдать правила именования.

А так я и сам предпочитаю json, с ним проще работать кроссязыковыми средставми.
0
29.07.2015, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2015, 19:24
Помогаю со студенческими работами здесь

Десериализация XML не срабатывает
Здравствуйте. Столкнулась с такой проблемой: неделю назад благополучно решила вопрос с записью...

Десериализация Xml to Object
Добрый день подскажите как десериализовать XmlDocumet . У меня есть XmlDocument &lt;MYPARAM...

Десериализация XML из string
Добрый день, у меня такой вопрос. Необходимо произвести десериализацию xml файла не из файла а из...

Десериализация xml документа
Имеется xml файл, который нужно десериализовать с помощью xsd схемы. При помощи xsd-схемы были...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru