Silver
Silver

Reputation: 453

Linq query select a particular value from xml

I have a xml sample below which I am parsing to get certain values

<Calendar region="abc">
  <Format version="1.11"/>
  <Data version="0"/>
  <Mode mode="FULL"/>
  <Period end="31122019" start="15122013"/>
  <Holidays>
    <Day serviceday="2" date="15122013"/>
  </Holidays>
  <ListOfRday>
    <Rday number="11">
      <Description text="Mon"/>
      <AppointedPeriod end="31122019" start="15122013" servicedays="11"/>
    </Rday>
  </ListOfRday>
</Calendar>

Like this there are many Rday entries in ListOfRday. How can I get description text for a particular Rday, say Rday number="20", using Linq. What will be the correct Linq select statement to get the value?

Upvotes: 1

Views: 354

Answers (2)

Aju Mon
Aju Mon

Reputation: 235

Parse your xml like code below

XDocument xmldoc = XDocument.Parse(cdata.Html);

xmldoc.Descendants("ListOfRday")
      .Descendants("Rday ")
      .Select(x => x.Attribute("number").Value.Equals("20"))
      .ToList()
      .First()

Upvotes: 0

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236188

var xdoc = XDocument.Load(path_to_xml);
var day = xdoc.Root.Element("ListOfRday").Elements("Rday")
                   .FirstOrDefault(d => (int)d.Attribute("number") == 20);

if (day == null)
   // day is not found - throw exception or return

var text = (string)day.Element("Description").Attribute("text");

Or in single query:

var text = xdoc.Root.Element("ListOfRday").Elements("Rday")
               .Where(d => (int)d.Attribute("number") == 20)
               .Select(d => (string)d.Element("Description").Attribute("text"))
               .FirstOrDefault();

Another option is usage of XPath:

var xpath = "//ListOfRday/Rday[@number='20']/Description";
var description = xdoc.XPathSelectElement(xpath);

if (description == null)
    // day is not found - throw exception or return

var text = (string)description.Attribute("text");

Upvotes: 1

Related Questions