2015-01-09 5 views
2

비누 서비스의 응답이 있습니다.XML을 여러 유사한 노드에 대해 XMLReader를 사용하여 C#으로 구문 분석하십시오.

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 응답을 구문 분석하고 목록을 만들려고 노력하고 있어요 :이 같은 모델을 정의

<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> 

Service Response


: 뭔가 것 같습니다 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(); 
+0

아마 LINQ2XML 좋은 해결책이 될 것입니다,하지만, 난 여전히 그것을 사용하는 방법을 모른다! 누구든지 조언 해주세요 !! – vohrahul

답변

2

사용

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(); 
+0

나는 작동하지 않는 것을 시도했다. 그것 이상한 그것은 어떤 오류도주지 않고 "ph"의 카운트는 0입니다. 나는 서비스가 많은 아이템들과 함께 유효한 응답을 반환한다는 것을 확인했습니다 .. – vohrahul

+0

당신의 참조를위한 스크린 샷을 추가했습니다. 제발 조언. – vohrahul

+0

게시 한 것보다 더 많은 XML이 있습니까? 루트 요소 마크 업입니까? , 귀하의 견본에서와 같이? 아니면 게시 한 샘플을 포함하는 요소가 더 있습니까? –