Azad Chouhan
Azad Chouhan

Reputation: 87

Use where condition for retrieving the xml data with C#

I want to fetch the data from an xml file. I am fetching the id of node from the previous page. And on next page I want to display the data from xml of that id. I am passing id of node using query string but when I run my code its give me this error

System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.

Here is my code

XElement xid = XElement.Parse(Request.QueryString["ID"]);

// var id = Request.QueryString["ID"];

var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));
var result = doc.Descendants("post")
                .Where(x => x.Element("id") == xid)
                .Select(x => new
                {
                    id = x.Element("id").Value,
                    title = x.Element("title").Value,
                    Discription = x.Element("Discription").Value,
                    dt = x.Element("dt").Value,
                    mnt = x.Element("mnt").Value,
                    yr = x.Element("yr").Value
                }).OrderByDescending(x => x.id).Take(5);

Repeater1.DataSource = result;
Repeater1.DataBind();

Here is my xml

<?xml version="1.0" encoding="utf-8"?>
<content>
  <post>
    <id>1</id>
    <title>fds</title>
    <Discription>fdsafsdf</Discription>
    <dt>21</dt>
    <mnt>6</mnt>
    <yr>2013</yr>
  </post>
</content>

Please tell me where I am going wrong

Upvotes: 0

Views: 3165

Answers (1)

Tim
Tim

Reputation: 28530

You don't indicate the line causing the error, but I bet it's this one:

XElement xid = XElement.Parse(Request.QueryString["ID"]);

Most likely "ID" in your query string is an identifier of some sort, not XML - hence the error.

Something like this is what you want:

string xid = Request.QueryString["ID"];

Then you can use it in your where clause.

Also, there's an error in your where clause - you're trying to compare an XElement to a value - you need to get the value of the XElement using it's Value property:

Where(x => x.Element("id").Value == xid)

XElement.Value returns a string - so simply take the string value from the query string and use it in the comparison in your where clause.

Everything Put Together

string xid = Request.QueryString["ID"];

var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));
var result = doc.Descendants("post")
                .Where(x => x.Element("id").Value == xid)
                .Select(x => new
                {
                    id = x.Element("id").Value,
                    title = x.Element("title").Value,
                    Discription = x.Element("Discription").Value,
                    dt = x.Element("dt").Value,
                    mnt = x.Element("mnt").Value,
                    yr = x.Element("yr").Value
                }).OrderByDescending(x => x.id).Take(5);

Repeater1.DataSource = result;
Repeater1.DataBind();

Upvotes: 2

Related Questions