Чтение Xml файла с использованием C# и возврат в виде списка объектов - PullRequest
0 голосов
/ 13 июля 2020

Это мой xml файл. Я хочу прочитать весь внутренний тест всех дочерних элементов exp

 <TreasuryExp xmlns="http://page.com/Exp" MsgDtTm="2020-06-08T12:30:35.283" 
MessageId="11EXP080620201" Source="11" Destination="CPSMS" Name="user1" RecordsCount="1861" 
NetAmountSum="4440306976.00">
<Exp>
<Year1>2018</Year1>
<Year2>2019</Year2>
<Code>11</Code>
<Budget>205500101638352</Budget>
<ObjectHeadCode>52_400</ObjectHeadCode>
<DDOCode>300008</DDOCode>
<VoucherNumber>5994</VoucherNumber>
<Date>31/03/2019</Date>
<GrossAmount>51200.00</GrossAmount>
<DeductionAmount>0.00</DeductionAmount>
<NetAmount>51200.00</NetAmount>
<UniqueID>3392430</UniqueID>
<PayeeCount>0</PayeeCount>
<PayDetail>N</PayDetail>
<PayeeDetails />
</Exp>
<Exp>
<Year1>2018</Year1>
<Year2>2019</Year2>
<Code>11</Code>
<Budget>205500101638352</Budget>
<ObjectHeadCode>52_400</ObjectHeadCode>
<DDOCode>300008</DDOCode>
<VoucherNumber>5995</VoucherNumber>
<Date>31/03/2019</Date>
<GrossAmount>4400.00</GrossAmount>
<DeductionAmount>0.00</DeductionAmount>
<NetAmount>4400.00</NetAmount>
<UniqueID>3303530</UniqueID>
<PayeeCount>0</PayeeCount>
<PayDetail>N</PayDetail>
<PayeeDetails />
</Exp>
</TreasuryExp>

i, прочитать его и запустить на l oop, но m получение возвращаемых одинаковых элементов каждый раз

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load("E:/trial/Expenditure.xml");
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
        XmlAttributeCollection attrColl = xmldoc.DocumentElement.Attributes;
        var xmlnsattribute = attrColl.GetNamedItem("xmlns").Value;
        XmlNodeList xmlnodli = xmldoc.SelectNodes("//ab:Expenditure", nsmgr);
        List<Expenditure> strli = new List<Expenditure>();

здесь я запускаю al oop для загрузки в список, чтобы получить значение xml узлов, или вы можете сказать значения каждого узла

        foreach (XmlNode xm in xmlnodli)
        {
                fin_year1 = Convert.ToInt32(xm.SelectSingleNode("//ab:Year1", nsmgr).InnerText),
                fin_year2 = Convert.ToInt32(xm.SelectSingleNode("//ab:Year2", nsmgr).InnerText),
                statecode = Convert.ToInt32(xm.SelectSingleNode("//ab:Code", nsmgr).InnerText),
                budgetcode = Convert.ToInt64(xm.SelectSingleNode("//ab:Budget", nsmgr).InnerText),
                objectheadcode = (xm.SelectSingleNode("//ab:ObjectHeadCode", nsmgr).InnerText).ToString(),
                ddocode = xm.SelectSingleNode("//ab:DDOCode", nsmgr).InnerText.ToString(),
                vouchernumber = Convert.ToInt32(xm.SelectSingleNode("//ab:VoucherNumber", nsmgr).InnerText),
                date = Convert.ToDateTime(xm.SelectSingleNode("//ab:Date", nsmgr).InnerText),
                grossamount = Convert.ToDecimal(xm.SelectSingleNode("//ab:GrossAmount", nsmgr).InnerText),
                deductionamount = Convert.ToDecimal(xm.SelectSingleNode("//ab:DeductionAmount", nsmgr).InnerText),
                netamount = Convert.ToDecimal(xmlnodli[i].SelectSingleNode("NetAmount", nsmgr).InnerText.ToString()),
                objectheadcode = Convert.ToString(xm.SelectNodes("//ab:NetAmount", nsmgr)),
                stateexpuniqueid = Convert.ToInt32(xm.SelectSingleNode("//ab:StateExpUniqueID", nsmgr).InnerText),
                payeecount = Convert.ToInt32(xm.SelectSingleNode("//ab:PayeeCount", nsmgr).InnerText),
                paydetail = Convert.ToString(xm.SelectSingleNode("//ab:PayDetail", nsmgr).InnerText),
         }
         return strli;

вот мой DTO

    public class Expenditure
    {
        public int year1 { get; set; }
        public int year2 { get; set; }
        public int code { get; set; }
        public long budget { get; set; }
        public string objectheadcode { get; set; }
        public string ddocode { get; set; }
        public int vouchernumber { get; set; }
        public DateTime date { get; set; }
        public decimal grossamount { get; set; }
        public decimal deductionamount { get; set; }
        public decimal netamount { get; set; }
        public int stateexpuniqueid { get; set; }
        public int payeecount { get; set; }
        public string paydetail { get; set; }
        public string payeedetails { get; set; }
        public string xmlns { get; set; }
        public string MsgDtTm { get; set; }
        public string MessageId { get; set; }
        public string Source { get; set; }
        public string Destination { get; set; }
        public string StateName { get; set; }
        public string RecordsCount { get; set; }
        public string NetAmountSum { get; set; }


    }

Спасибо

1 Ответ

0 голосов
/ 13 июля 2020

Используйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Globalization;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializier = new XmlSerializer(typeof(TreasuryExp));
            TreasuryExp treasuryExp = (TreasuryExp)serializier.Deserialize(reader);
        }
    }
    [XmlRoot(ElementName = "TreasuryExp", Namespace = "http://page.com/Exp")]
    public class TreasuryExp
    {
        [XmlElement("Exp")]
        public List<Expenditure> Expenditure { get; set; }

    }
    public class Expenditure
    {
        [XmlElement("Year1")]
        public int year1 { get; set; }
        [XmlElement("Year2")]
        public int year2 { get; set; }
        [XmlElement("Code")]
        public int code { get; set; }
        [XmlElement("Budget")]
        public long budget { get; set; }
        [XmlElement("ObjectHeadCode")]
        public string objectheadcode { get; set; }
        [XmlElement("DDOCode")]
        public string ddocode { get; set; }
        [XmlElement("VpucherNumber")]
        public int vouchernumber { get; set; }

        private DateTime _date { get; set; }
        [XmlElement("Date")]
        public string date 
        { 
            get{ return _date.ToString("dd/MM/yyyy");} 
            set{ _date = DateTime.ParseExact(value, "dd/MM/yyyy", CultureInfo.InvariantCulture);} 
        }
        [XmlElement("GrossAmount")]
        public decimal grossamount { get; set; }
        [XmlElement("DectionAmount")]
        public decimal deductionamount { get; set; }
        [XmlElement("NetAmount")]
        public decimal netamount { get; set; }
        [XmlElement("UniqueID")]
        public int stateexpuniqueid { get; set; }
        [XmlElement("PayeeCount")]
        public int payeecount { get; set; }
        [XmlElement("PayeeDetail")]
        public string paydetail { get; set; }
        [XmlElement("PayeeDetails")]
        public string payeedetails { get; set; }
        [XmlElement("")]
        public string xmlns { get; set; }
        [XmlElement("")]
        public string MsgDtTm { get; set; }
        [XmlElement("")]
        public string MessageId { get; set; }
        [XmlElement("")]
        public string Source { get; set; }
        [XmlElement("")]
        public string Destination { get; set; }
        [XmlElement("")]
        public string StateName { get; set; }
        [XmlElement("")]
        public string RecordsCount { get; set; }
        [XmlElement("")]
        public string NetAmountSum { get; set; }
    }
}
...