Как конвертировать следующий Xml в C# объект - PullRequest
0 голосов
/ 08 января 2020
<Reports>
   <Report>
       <data Id="2018" type="4" />
       <ReportAddendum>
          <data raID="876" ratext="Text here 1." />
       </ReportAddendum>
       <ReportAddendum>
          <data raID="134" ratext="Text here 2." />
       </ReportAddendum>
       <ReportAddendum>
          <data raID="552" ratext="sfdsfsd" />
       </ReportAddendum>
</Report>

Ранее <ReportAddendum> ранее не было, поэтому я создал следующее:

[XmlRoot(ElementName = "Reports")]
public class ClassReport
{
    [XmlArray("Report")]
    [XmlArrayItem("data")]
    public List<ReportList> Reports { get; set; }
}

public class ReportList
{
    [XmlAttribute]
    public string Id { get; set; }
    [XmlAttribute]
    public string type { get; set; }
}

Все отлично работает. Но проблема в том, что добавление, которое было добавлено позже, не конвертируется, даже если я добавлю

[XmlRoot(ElementName = "Reports")]
public class ClassReport
{
    [XmlArray("Report")]
    [XmlArrayItem("data")]
    public List<ReportList> Reports { get; set; }

    [XmlArray("ReportAddendum")]
    [XmlArrayItem("data")]
    public List<AddendumList> AddendumList { get; set; }
}

, а затем создаю класс, подобный ReportList.

1 Ответ

2 голосов
/ 08 января 2020

Используйте xmltocsharp для преобразования XML в C# модели

[XmlRoot(ElementName = "data")]
public class Data
{
    [XmlAttribute(AttributeName = "raID")]
    public string RaID { get; set; }
    [XmlAttribute(AttributeName = "ratext")]
    public string Ratext { get; set; }
}

[XmlRoot(ElementName = "ReportAddendum")]
public class ReportAddendum
{
    [XmlElement(ElementName = "data")]
    public Data Data { get; set; }
}

public class ReportList
{
    [XmlAttribute]
    public string Id { get; set; }
    [XmlAttribute(AttributeName = "type")]
    public string Type { get; set; }
}

[XmlRoot(ElementName = "Report")]
public class Report
{
    [XmlElement(ElementName = "data")]
    public ReportList Data { get; set; }

    [XmlElement(ElementName = "ReportAddendum")]
    public List<ReportAddendum> ReportAddendum { get; set; }
}

[XmlRoot(ElementName = "Reports")]
public class Reports
{
    [XmlElement(ElementName = "Report")]
    public Report Report { get; set; }
}

, затем используйте XmlSerializer для преобразования xml в C# объект

using (StreamReader r = new StreamReader(xmlFile))
{
    string xmlString = r.ReadToEnd();

    XmlSerializer ser = new XmlSerializer(typeof(Reports));

    using (TextReader reader = new StringReader(xmlString))
    {
        var reports = (Reports)ser.Deserialize(reader);
        Console.WriteLine($"{reports.Report.Data.Id}:{reports.Report.Data.Type}");
        foreach (var reportAddendum in reports.Report.ReportAddendum)
        {
            Console.WriteLine($"{reportAddendum.Data.RaID}:{reportAddendum.Data.Ratext}");
        }
    }
}

out out

2018:4
876:Text here 1.
134:Text here 2.
552:sfdsfsd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...