maxpoitn2point
@maxpoitn2point
Как всегда, в своем репертуаре

В чем ошибка при десериализации xml?

Пытаюсь разобраться как парсить xml документы на новом для себя языке.

имеется простой документ
<A class=" FB_FW_ext BlitzScPluginAdapter">
<url replyId="6b8745a8-583e-4a60-b7e7-36ce63684016">http://localhost:8080/opt/out/ReplyRestsShop_v2/1</url>
<url replyId="5b11c3cd-0d67-4914-9983-affb77f9e90c">http://localhost:8080/opt/out/ReplyRests/2</url>
<url replyId="42360627-9dc0-401a-bee3-d2ff9dbab96c">http://localhost:8080/opt/out/Ticket/3</url>
<url replyId="42360627-9dc0-401a-bee3-d2ff9dbab96c">http://localhost:8080/opt/out/Ticket/4</url>
<url replyId="a593ba0b-759a-45c3-a5c5-989d2bbefe48">http://localhost:8080/opt/out/ReplyRestsShop_v2/5</url>
<ver>1</ver>
</A>


делаю следующим способом
[Serializable()]
    public class LinkPosition
    {
        [XmlElement("url")]
        public string url { get; set; }
        [XmlAttribute("replyId")]
        public string replyId { get; set; }
    }
    [Serializable()]
    [XmlRoot("A")]
    public class InboxDocuments : Documents
    {
        [XmlArray("url")]
        [XmlArrayItem("url", typeof(LinkPosition))]
        public LinkPosition[] list { get; set; }
    }

public static void Main()
        {
            InboxDocuments inbox = null;

            XmlSerializer serializer = new XmlSerializer(typeof(InboxDocuments));

            WebRequest request = WebRequest.Create("http://localhost:8080/opt/out");
            WebResponse response = request.GetResponse();

            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream);
                inbox = (InboxDocuments)serializer.Deserialize(reader);

            }
            response.Close();
            Console.WriteLine(inbox.list[0].url);
     }


Но возникает исключение System.IndexOutOfRangeException: "Индекс находился вне границ массива."
Что я делаю не так. спасибо.
  • Вопрос задан
  • 470 просмотров
Решения вопроса 1
@cicatrix
было бы большой ошибкой думать
Индекс вне границ массива, потому что внутри списка пусто. А пусто, потому что класс неправильно организован.

Вот так должно быть:
[XmlRoot]
public class A
{
    [System.Xml.Serialization.XmlElementAttribute("url")]
    public Reply[] replies { get; set; }

    [XmlTypeAttribute(AnonymousType = true)]
    public class Reply
    {
        [XmlAttribute("replyId")]
        public string replyId { get; set; }
        [XmlText()]
        public string Url { get; set; }
    } // Url
} // class A


Вообще, класс под XML лучше не писать, а просто скопировать текст из XML/Json и в Visual Studio в меню выбрать: Edit/Paste Special/Paste as XML classes.
606ff76b7dd6e768671799.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
1. что мешает остановиться перед обращением к индексируемому и посмотреть что там?
2. будет полезно сгенерировать классы по xsd
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы