user1254282
user1254282

Reputation: 53

Parsing xml. return one object not collection

I have a xml file:

  <Result>Ok</Result>
  <Error></Error>
  <Remark></Remark>
  <Data>
    <Movies>
      <Movie ID='2'>
        <Name><![CDATA[TestName]]></Name>
        <Duration Duration='170'>2h 50min</Duration>            
        <Properties>
          <Property Name='11'><![CDATA[1111110]]></Property>
        </Properties>
        <Rental from_date='' to_date=''>
          <SessionCount></SessionCount>
          <PU_NUMBER></PU_NUMBER>
        </Rental>
      </Movie>
    </Movies>
  </Data>
</XML>

Code for pasring xml file:

var results = from element in XDocument.Parse(queryResponse).Descendants("Movie")
                          select new BaseEvent
                          {
                              OID = (int)element.Attribute("ID"),
                              Subject = (string)element.Element("Name"),
                              Duration = (int)element.Element("Duration").Attribute("Duration")
                          };

The problem in that Descedants retruns IEumerable<BaseEvent> but I want that will be BaseEvent. How can I do this?

Upvotes: 0

Views: 106

Answers (2)

Oded
Oded

Reputation: 499152

Add a .First() to get the first element:

from element in XDocument.Parse(queryResponse).Descendants("Movie")
                          select new BaseEvent
                          {
                              OID = (int)element.Attribute("ID"),
                              Subject = (string)element.Element("Name"),
                              Duration = (int)element.Element("Duration").Attribute("Duration")
                          }.First();

You can alternatively use FirstOrDefault() (in case there are no such nodes), Last() or Single().

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1502406

Just use First(), Last(), Single(), FirstOrDefault() etc.

Personally I'd do that initially, rather than doing it all in a query:

var element = XDocument.Parse(queryResponse)
                       .Descendants("Movie")
                       .FirstOrDefault();
if (element == null)
{
    // Handle the case of no movies
}
else
{
    var baseEvent = new BaseEvent
                    {
                        OID = (int) element.Attribute("ID"),
                        Subject = (string) element.Element("Name"),
                        Duration = (int) element.Element("Duration")
                                                .Attribute("Duration")
                    };
    // Use baseEvent
}

Upvotes: 2

Related Questions