2010-12-27 6 views
1

타사 웹 서비스를 호출합니다. 이 서비스는 일반 old xml로 응답을 반환합니다. 샘플 응답은 다음과 같습니다.LINQ를 사용하여 XML 구문 분석

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.somedomain.com/Response.xsd"> 
    <Results> 
    <Result> 
     <ID>1</PointID> 
     <Name>Testing</Name> 
    </Result> 
    </Results> 
</Response> 

이 XML을 LINQ를 통해 CLR 개체로로드하려고합니다. 내 CLR 개체 선언은 다음과 같습니다 : CLR은 객체로이 XML을로드하기위한 시도에서

[DataContract] 
public class Result 
{ 
    private int id = 0; 

    private string name = string.Empty; 

    [DataMember] 
    public int ID 
    { 
    get { return id; } 
    set { id = value; } 
    } 

    [DataMember] 
    public string Name 
    { 
    get { return name; } 
    set { name = value; } 
    } 

    public Result() 
    { 

    } 
} 

, 나는 다음과 같은 접근 방식으로 갈거야 :

string response = UseWebService(); 
XDocument xml = XDocument.Parse(response); 

var results = from result in xml.Descendants().Descendants() 
       select new Result 
       { 
       ID = Convert.ToInt32(result.Descendants("ID")), 
       Name = result.Descendants("Name").ToString() 
       }; 

List<Result> resultList = results.ToList(); 
return resultList; 

이 코드를 사용하는 경우,

Unable to cast object of type '<GetDescendants>d__a' to type 'System.IConvertible'. 

"ID = Convert.ToInt32 ..."라고하는 행을 주석 처리하면 작동합니다. 그러나 이름은 "System.Xml.Linq.XContainer + d__a"로 설정됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? XML을 일부 POCO에로드하려고합니다.

제공할만한 통찰력을 가져 주셔서 감사합니다.

답변

2

Descendants은 Object 컬렉션이므로 단일 인스턴스를 가져와야합니다. 당신이 그 값을 얻을 필요가 있으므로

그래서 언급 후손으로이

Name = result.Element("Name").Value.ToString

+0

왜 "개체 참조가 개체의 인스턴스로 설정되지 않습니다." 이 접근법에 오류가 있습니까? 너무 이상해. – Villager

0

같은 일을하는 객체의 목록입니다, 기본 toString() 객체의 이름이됩니다.

var results = from result in xml.Descendants().Descendants() 
        select new Result 
        { 
        ID = Convert.ToInt32(result.Descendants("ID").Value), 
        Name = result.Descendants("Name").Value 
        };