Десериализовать этот XML-файл и получить данные - PullRequest
1 голос
/ 30 октября 2019

У меня есть этот XML-файл:

<readyGrid>
<gridRows>
<gridRow id="0">
<gridCol id="1">N.Doc.</gridCol>
<gridCol id="2">N.Doc. solo numero</gridCol>
<gridCol id="3">Data</gridCol>
<gridCol id="4">Intestatario</gridCol>
<gridCol id="5">Causale</gridCol>
<gridCol id="6">Stato</gridCol>
<gridCol id="7">Tot.doc.</gridCol>
<gridCol id="8">Data</gridCol>
<gridCol id="9">Peso</gridCol>
<gridCol id="10">Contrassegno</gridCol>
<gridCol id="11">Porto</gridCol>
<gridCol id="12">CAP</gridCol>
<gridCol id="13">Destinazione</gridCol>
<gridCol id="14">Indirizzo</gridCol>
<gridCol id="15">Citta'</gridCol>
<gridCol id="16">Provincia</gridCol>
<gridCol id="17">Colli</gridCol>
<gridCol id="18">Email</gridCol>
<gridCol id="19">Servizio</gridCol>
<gridCol id="20">Pagamento</gridCol>
<gridCol id="21">Fermo deposito</gridCol>
<gridCol id="22">Telefono destinatario</gridCol>
<gridCol id="23">Cellulare intestatario</gridCol>
</gridRow>
<gridRow id="1">
<gridCol id="1">any</gridCol>
<gridCol id="2">any</gridCol>
<gridCol id="3">any</gridCol>
<gridCol id="4">any</gridCol>
<gridCol id="5">any</gridCol>
<gridCol id="6">any</gridCol>
<gridCol id="7">any</gridCol>
<gridCol id="8">any</gridCol>
<gridCol id="9">any</gridCol>
<gridCol id="10">any</gridCol>
<gridCol id="11">any</gridCol>
<gridCol id="12">any</gridCol>
<gridCol id="13">any</gridCol>
<gridCol id="14">any</gridCol>
<gridCol id="15">any</gridCol>
<gridCol id="16">any</gridCol>
<gridCol id="18">any</gridCol>
<gridCol id="19">any</gridCol>
<gridCol id="20">any</gridCol>
<gridCol id="22">any</gridCol>
</gridRow>
</gridRows>
</readyGrid>

Это динамический файл, в котором может быть много gridRow, все внутри тега.

: где id равен 0, он говоритстолбец заголовка, и из id = "1" он перечисляет все данные.

Мне нужно десериализовать этот файл .XML в классах. Вот что у меня есть на данный момент:

[XmlRoot(Namespace = "", ElementName = "readyGrid")]
public class Root
{
    [XmlElement("gridRows")]
    public List<GridRows> GridRows { get; set; }
}

public class GridRows
{
    [XmlElement("gridRow")]
    public List <GridRow> GridRow { get; set; }
}

public class GridRow
{
    [XmlAttribute("id")]
    public int Id { get; set; } 
    [XmlAttribute("gridCol")]
    public List<GridCol> GridCol { get; set; }
}

public class GridCol
{
    [XmlAttribute("id")]
    public int idColumn { get; set; }
    public string Content { get; set; }
}

И код, который следует десериализовать и поместить в классы:

XmlSerializer serializer = new XmlSerializer(typeof(Root));
var reader = new StreamReader(uploadFilePath);
List<GridRows> results = ((Root)serializer.Deserialize(reader)).GridRows;

Однако последний пример кода не работает, сбойна первой линии. (System.InvalidOperationException, ошибка в отражении ..)

Интересно, есть ли самый простой способ десериализации этого XML-файла в классах или что я должен изменить в коде, чтобы заставить его работать. Важно то, что я беру id = "" и содержимое между тегами.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Самым простым способом, конечно же, остается xsd.exe, поставляемый с .NET SDK. В командной строке разработчика вы можете назвать ее как

xsd <Path to your example XML file> /classes

. Она сгенерирует для вас классы, которые напоминают структуру вашего XML-файла. В качестве альтернативы, он также может генерировать схему для вас, и есть несколько вариантов для настройки генерации кода, например, путем предоставления пространства имен. Просто вызовите xsd.exe без каких-либо аргументов, и он даст вам инструкции, как его использовать.

0 голосов
/ 30 октября 2019

Сделано это после некоторых незначительных изменений в ваших классах

XmlRoot("readyGrid")]
public class Root
{
    [XmlElement("gridRows")]
    public List<GridRows> GridRows { get; set; }
}

public class GridRows
{
    [XmlElement("gridRow")]
    public List<GridRow> GridRow { get; set; }
}

public class GridRow
{
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlElement("gridCol")]
    public List<GridCol> GridCol { get; set; }
}

public class GridCol
{
    [XmlAttribute("id")]
    public int idColumn { get; set; }

    [XmlText]
    public string Content { get; set; }
}

Использование

XmlSerializer serializer = new XmlSerializer(typeof(Root));
using (var reader = new StreamReader(xmlFilePath))
{
    var root = ((Root)serializer.Deserialize(reader));
}
...