2013-03-20 3 views
1

XML 형식의 웹 사이트에서 일부 데이터를 가져 오는 중이며 연속 노드가 없을 때 제대로 작동하지만 문제가있을 때이를 반복하는 방법을 찾는 데 문제가 있습니다. 내가 얻을 수있는 데이터는 다음과 같습니다.반복적 인 XML 노드

<whmcsapi> 
    <action>gettickets</action> 
    <numreturned>1</numreturned> 
    <tickets> 
    <ticket> 
    <tid>557168</tid> 
    <name><![CDATA[Array]]></name> 
    <subject><![CDATA[Test Ticket]]></subject> 
    <message><![CDATA[This is a test ticket> 
    <ticket> 
    <ticket> 
    <tid>557168</tid> 
    <name><![CDATA[Array]]></name> 
    <subject><![CDATA[Test Ticket]]></subject> 
    <message><![CDATA[This is a test ticket> 
    <ticket> 

어떻게 각 노드에서 데이터를 읽고 읽을 수 있습니까? 내 코드는 지금

public class Ticket 
{ 
    public string ID; 
    public string TicketID; 
    public string DeptID; 
    public string UserID; 
    public string Name; 
    public string Email; 
    public string CC; 
    public string Subject; 
    public string Message; 
    public string Status; 
    public string Priority; 
    public DateTime Date; 
    public DateTime LastResponse; 
    public IPAddress IP; 
} 
+0

모든 문서 세트를 제공해야하는'doc.Descendants ("ticket")'(단수에 유의하십시오)를 사용해보십시오. 또한 XML에 표시되는'id'라는 요소가 없으므로 오류가 발생합니다. – Tim

+0

고마워, 나는 이것을 시도 할 것이다! 붙여 넣은 XML은 원본이 상당히 길기 때문에 완성되지 않았습니다. 나는 그것을 읽기 쉽게 유지하기 위해 조금 잘라 냈다. –

+0

방금 ​​함수에서 var를 반환 할 수 없다는 것을 깨달았습니다. 이 데이터를 반환하는 가장 좋은 방법은 무엇입니까? –

답변

4
List<Ticket> supportTickets = 
    (from x in doc.Descendants("ticket") 
    select new Ticket 
    { 
     ID = x.Element("id").Value, 
     TicketID = x.Element("tid").Value, 
     DeptID = x.Element("deptid").Value, 
     UserID = x.Element("userid").Value, 
     Name = x.Element("name").Value, 
     Email = x.Element("email").Value, 
     Subject = x.Element("subject").Value, 
     Message = x.Element("message").Value, 
    }).ToList(); 

당신이 코드를 시도 할 수 있습니다 ... ... 다음과 같다

public List<Ticket> Get_Tickets() 
    { 
     Dictionary<string, string> args = new Dictionary<string, string>(); 
     args.Add("status", "All Active Tickets"); 

     string data = Get_Data("gettickets", args); 
     XDocument doc = XDocument.Parse(data); 

     //var support_tickets = doc.Descendants("ticket").Select(ticket => new 
     List<Ticket> support_tickets = (from x in doc.Descendants("ticket") select new Ticket 
     { 
      ID = x.Element("id").Value, 
      TicketID = x.Element("tid").Value, 
      DeptID = x.Element("deptid").Value, 
      UserID = x.Element("userid").Value, 
      Name = x.Element("name").Value, 
      Email = x.Element("email").Value, 
      Subject = x.Element("subject").Value, 
      Message = x.Element("message").Value, 
     }).ToList(); 

     return support_tickets; 
    } 

티켓 클래스입니다. 존재하지 않는 Element의 값을 되 찾으려하면 예외가 throw됩니다.

+0

"Ticket"이라는 컨테이너 클래스를 만들고이 모든 것을 멤버로 지정했지만 ticket.Element가 존재하지 않기 때문에 인식되지 않습니다 –

+0

LINQ 쿼리에서 'XElement'를 사용하지 않는 것은 .NET 클래스이므로 . '(doc.Descendants ("ticket")의 x에서 온 것입니다.)'x.Element ("id") .Value 등을 할 수 있습니다. – Tim

+0

@BrettPowell - 질문을 업데이트 할 수 있습니까? 귀하의 코드를 사용하여 빠른 테스트 응용 프로그램을 작성했습니다 (필자는 Descendants ("티켓")을 "티켓"으로 변경 한 것을 제외하고). – Tim