Reading Top Five records from XML file ......

Let say I have 100 articles in my XML file and I like to read the top most five articles, how would I do this?
I can read all the articles like this

DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("Articles.xml"));
DataView dv  = ds.Tables[0].DefaultView;

DataList1.DataSource = dv;
DataList1.DataBind();

But I don’t know how would I read top five articles from the xml file.
Thanks





XmlFile
--------------

<?xml version="1.0"?>
<articles>
    <article>
        <id>050</id>
        <title>Article 050 Title</title>
        <author>SomeGuy</author>
        <dateposted>10/22/2003</dateposted>
        <smalldescription>Small description</smalldescription>
        <longdescription>Long Description</longdescription>
        <code>Some code</code>
    </article>
</articles>


C# Code

private void Page_Load(object sender, System.EventArgs e)
{
      DataSet ds = new DataSet();
      ds.ReadXml(Server.MapPath("Articles.xml"));
      DataView dv  = ds.Tables[0].DefaultView;

      DataList1.DataSource = dv;
      DataList1.DataBind();
}




adamullahAsked:
Who is Participating?
 
purpleblobCommented:
Very good point re:support of the function position by MS

So I thought I should try this in .NET. It appears to work fine except I made a small mistake in the XPath statement it should have read

//article[position() <= 5]

Thus becomes

System.Xml.XmlNodeList nodes = xmldoc.SelectNodes("//article[position() <= 5]");

The /* will return the inner items within the top 5 elements as opposed to the elements themselves - whoops, sorry about that
0
 
ericsDevCommented:
**UNTESTESTED**

you can load the records into your DataView and then loop through the DataView and remove all but the rows you want to keep something like this.

for(int x = 0; x < dv.Rows.Count; x++)
{
if(x>=5)
{
dv.Rows[x].Delete();
}
}

I believe this will work unless there is a better way that someone else knows about :)
0
 
purpleblobCommented:
What about using XPath on the XML first to extract the required subset of article elements - something like

//article[position() <= 5]/*

where 5 is the first five elements


0
Cloud Class® Course: Certified Penetration Testing

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

 
ericsDevCommented:
that should work as long as position() is a supported function by MS... I've found that alot of them aren't... you should be able to find that info here: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/xsd_ref_8nas.asp
0
 
ericsDevCommented:
purpleblob: good work, I will keep this method in mind.
0
 
adamullahAuthor Commented:
Thanks purpleblob, i also find a good site for XPath. http://www.w3schools.com/xpath/xpath_location.asp

Here is the modified code.


C# codebehind code
------------------------
private void Page_Load(object sender, System.EventArgs e)
{
      XmlDocument xd = new XmlDocument();
      XmlNodeList nl;

      xd.Load(Server.MapPath("Articles.xml"));

      nl = xd.SelectNodes("/articles/article[position() <=3]");
      
      lstArticles.DataSource = nl;
      lstArticles.DataBind();

}


aspx page code:
-------------------
<asp:datalist id="lstArticles" runat="server">
      <itemtemplate>
            <%# ((System.Xml.XmlNode)Container.DataItem).SelectSingleNode("id").InnerText %>
            <br>
            <%# ((System.Xml.XmlNode)Container.DataItem).SelectSingleNode("title").InnerText %>
      </itemtemplate>
</asp:datalist>



XmlFile
--------
<?xml version="1.0"?>
<articles>
    <article>
        <id>050</id>
        <title>Article 050 Title</title>
        <author>SomeGuy</author>
        <dateposted>10/22/2003</dateposted>
        <smalldescription>Small description</smalldescription>
        <longdescription>Long Description</longdescription>
        <code>Some code</code>
    </article>
</articles>
 
 
0
 
adamullahAuthor Commented:
purpleblob you got all the points............
0
 
purpleblobCommented:
Many thanks

Glad to have helped
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.