Почему десериализация такого XML не работает ?
От: Glestwid  
Дата: 25.12.20 20:23
Оценка:
В envelope оказывается список без транзакций. Как поменять декларацию транзакции или использование XmlSerializer чтобы вот такой xml превращался в список? XML не менять — такой приходит извне.

var newXml =@"
<reestr>
    <paymentTransaction xmlns='http://privilege.sbibank.ru/'>
        <tranId>ABCDEF</tranId>
        <tranSum>262</tranSum>
        <tranDate>2016-12-03T11:43:40.907+03:00</tranDate>
    </paymentTransaction>
    <paymentTransaction xmlns='http://privilege.sbibank.ru/'>
        <tranId>ZXCV</tranId>
        <tranSum>234.1</tranSum>
        <tranDate>2016-12-13T11:43:40.907+03:00</tranDate>
    </paymentTransaction>
    <paymentTransaction xmlns='http://privilege.sbibank.ru/'>
        <tranId>BNMF</tranId>
        <tranSum>7262</tranSum>
        <tranDate>2016-12-23T11:43:40.907+03:00</tranDate>
    </paymentTransaction>
</reestr>
";

        [XmlType("paymentTransaction")]
        public class PmtTransaction {
            [XmlElement("tranId")]
            public long TranId { get; set; }
        }

            XmlSerializer ser2 = new XmlSerializer(typeof(List<PmtTransaction>)
               , new XmlRootAttribute("reestr")
                );

            List<PmtTransaction> envelope;
            using (StringReader reader = new StringReader(newXml))
            {
                envelope = (List<PmtTransaction>)ser2.Deserialize(reader);

                return envelope;
            }
Re: Почему десериализация такого XML не работает ?
От: mDmitriy Россия  
Дата: 26.12.20 10:05
Оценка: +1
Здравствуйте, Glestwid, Вы писали:

G> <tranId>ABCDEF</tranId>


G> [XmlElement("tranId")]

G> public long TranId { get; set; }

значение tranId не long как минимум
Re[2]: Почему десериализация такого XML не работает ?
От: Glestwid  
Дата: 26.12.20 16:51
Оценка:
G>> <tranId>ABCDEF</tranId>

G>> [XmlElement("tranId")]

G>> public long TranId { get; set; }

D>значение tranId не long как минимум



Это я в порыве обфускации забыл сменить. Можно и числа подставить в XML — результат ровно такой же, список с 0 элементов.
Отредактировано 26.12.2020 16:51 Glestwid . Предыдущая версия .
Re: Почему десериализация такого XML не работает ?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.12.20 17:48
Оценка:
Здравствуйте, Glestwid, Вы писали:

Может NameSpace добавить
https://docs.microsoft.com/ru-ru/dotnet/api/system.xml.serialization.xmltypeattribute.namespace?view=net-5.0
 [XmlType(TypeName = "paymentTransaction",Namespace = "http://privilege.sbibank.ru/")]
        public class PmtTransaction
и солнце б утром не вставало, когда бы не было меня
Re: Почему десериализация такого XML не работает ?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 26.12.20 18:43
Оценка: 3 (1) +2
Здравствуйте, Glestwid, Вы писали:

G>В envelope оказывается список без транзакций. Как поменять декларацию транзакции или использование XmlSerializer чтобы вот такой xml превращался в список? XML не менять — такой приходит извне.


Я бы сделал так:
[XmlRoot("reestr")]
public class Reestr
{
    [XmlElement("paymentTransaction", Namespace = "http://privilege.sbibank.ru/")]
    public List<PmtTransaction> Transactions { get; set; }
}

public class PmtTransaction
{
    [XmlElement("tranId")]
    public string TranId { get; set; }
}


И потом просто вызывал бы так:
XmlSerializer ser2 = new XmlSerializer(typeof(Reestr));

using (StringReader reader = new StringReader(newXml))
{
    var envelope = (Reestr) ser2.Deserialize(reader);
    return envelope.Transactions;
}
Re[2]: Почему десериализация такого XML не работает ?
От: Glestwid  
Дата: 26.12.20 19:00
Оценка:
S>Может NameSpace добавить
S>https://docs.microsoft.com/ru-ru/dotnet/api/system.xml.serialization.xmltypeattribute.namespace?view=net-5.0
S>
S> [XmlType(TypeName = "paymentTransaction",Namespace = "http://privilege.sbibank.ru/")]
S>        public class PmtTransaction
S>



А Вы пробовали так сделать? Я только что попробовал (.NET Core 3) — пофигу, список по-прежнему пустой.
Re[2]: Почему десериализация такого XML не работает ?
От: Glestwid  
Дата: 26.12.20 19:04
Оценка:
G>>В envelope оказывается список без транзакций. Как поменять декларацию транзакции или использование XmlSerializer чтобы вот такой xml превращался в список? XML не менять — такой приходит извне.

МР>Я бы сделал так:

МР>
МР>[XmlRoot("reestr")]
МР>public class Reestr
МР>{
МР>    [XmlElement("paymentTransaction", Namespace = "http://privilege.sbibank.ru/")]
МР>    public List<PmtTransaction> Transactions { get; set; }
МР>}

МР>public class PmtTransaction
МР>{
МР>    [XmlElement("tranId")]
МР>    public string TranId { get; set; }
МР>}
МР>


МР>И потом просто вызывал бы так:

МР>
МР>XmlSerializer ser2 = new XmlSerializer(typeof(Reestr));

МР>using (StringReader reader = new StringReader(newXml))
МР>{
МР>    var envelope = (Reestr) ser2.Deserialize(reader);
МР>    return envelope.Transactions;
МР>}
МР>



Супер! То, что надо. Никогда не знал, что список можно описать еще и так в XML

МР>    [XmlElement("paymentTransaction", Namespace = "http://privilege.sbibank.ru/")]
МР>    public List<PmtTransaction> Transactions { get; set; }
Re[3]: Почему десериализация такого XML не работает ?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.12.20 19:21
Оценка:
Здравствуйте, Glestwid, Вы писали:



G>А Вы пробовали так сделать? Я только что попробовал (.NET Core 3) — пофигу, список по-прежнему пустой.

Проще сериализовать и сравнить результат
https://stackoverflow.com/questions/12924221/using-xmlserializer-with-an-array-in-the-root-element
http://www.codemeit.com/xml/c-xmlserializer-add-an-attribute-to-an-array-element.html
и солнце б утром не вставало, когда бы не было меня
Отредактировано 26.12.2020 19:26 Serginio1 . Предыдущая версия . Еще …
Отредактировано 26.12.2020 19:25 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.