簡體   English   中英

使用XMLReader在c#中解析多個類似節點的XML

[英]Parse XML in c# with XMLReader for multiple similar Nodes

我收到肥皂服務的回復。 它看起來像:

<ArrayOfPaymentHistory_ST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <PaymentHistory_ST>
    <tTRANSDATE>2015-01-05T08:58:17</tTRANSDATE>
    <tPAIDTO>2015-02-01T00:00:00</tPAIDTO>
    <dAMOUNT>110</dAMOUNT>
    <dBALANCE>0</dBALANCE>
    <TRANSKIND>Auto CC Payment</TRANSKIND>
    <csUnit>Lee</csUnit>
  </PaymentHistory_ST>
  <PaymentHistory_ST>
    <tTRANSDATE>2015-01-01T08:58:17</tTRANSDATE>
    <tPAIDTO>2015-01-01T00:00:00</tPAIDTO>
    <dAMOUNT>-110</dAMOUNT>
    <dBALANCE>110</dBALANCE>
    <TRANSKIND>Rent Posted</TRANSKIND>
    <csUnit>Lee</csUnit>
  </PaymentHistory_ST>
</ArrayOfPaymentHistory_ST>

服務響應


我已經定義了這樣的模型:

public class payment_history
{
    public DateTime tTRANSDATE { get; set; }
    public DateTime tPAIDTO { get; set; }
    public double dAMOUNT { get; set; }
    public double dBALANCE { get; set; }
    public string TRANSKIND { get; set; }
}

我正在嘗試解析此XML響應並創建payment_history類型的對象列表。 然后,我將在標記上發送此對象並顯示在表格中。 我發現了許多使用XMLReader進行XML解析的帖子。 我仍然無法找到一個可以優雅地做到這一點的好解決方案。

這是我的c#代碼。

List<payment_history> ph = new List<payment_history>();
payment_history p = new payment_history();

            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd();

                    using (XmlReader reader = XmlReader.Create(new StringReader(soapResult)))
                    {
                        #region parseXML
                        while (reader.Read())
                        {
                            foreach (var el in reader.ReadOuterXml())
                            {
                                if (reader.IsStartElement())
                                {
                                    //return only when you have START tag
                                    switch (reader.Name.ToString())
                                    {
                                        case "tTRANSDATE":
                                            p.tTRANSDATE = Convert.ToDateTime(reader.ReadString());
                                            break;

                                        case "tPAIDTO":
                                            p.tPAIDTO = Convert.ToDateTime(reader.ReadString());
                                            break;

                                        case "dAMOUNT":
                                            p.dAMOUNT = Convert.ToDouble(reader.ReadString());
                                            break;

                                        case "dBALANCE":
                                            p.dBALANCE = Convert.ToDouble(reader.ReadString());
                                            break;
                                        case "TRANSKIND":
                                            p.TRANSKIND = reader.ReadString();
                                            break;
                                    }
                                    ph.Add(p);
                                }
                            }
                        }
                        #endregion
                    }
                }
            }
            return ph;

有人可以指導這項工作嗎? 我是c#的新手。 任何形式的幫助將不勝感激。


我試過跟隨LINQ2XML。 但是什么都不回!

ph = XDocument.Parse(soapResult)
                 .Descendants("PaymentHistory_ST")
                 .Select(g => new payment_history
                 {
                     tTRANSDATE = (DateTime)g.Element("tTRANSDATE"),
                     tPAIDTO = (DateTime)g.Element("tPAIDTO"),
                     dAMOUNT = (double)g.Element("dAMOUNT"),
                     dBALANCE = (double)g.Element("dBALANCE"),
                     TRANSKIND = (string)g.Element("TRANSKIND")
                 }).ToList();

采用

XDocument doc = XDocument.Load(response.GetResponseStream());
XNamespace df = "http://tempuri.org/";

List<payment_history> ph = doc.Descendants(df + "PaymentHistory_ST")
                 .Select(g => new payment_history
                 {
                     tTRANSDATE = (DateTime)g.Element(df + "tTRANSDATE"),
                     tPAIDTO = (DateTime)g.Element(df + "tPAIDTO"),
                     dAMOUNT = (double)g.Element(df + "dAMOUNT"),
                     dBALANCE = (double)g.Element(df + "dBALANCE"),
                     TRANSKIND = (string)g.Element(df + "TRANSKIND")
                 }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM