使用C#从xml中选择前5个记录

时间:2013-06-21 09:07:20

标签: asp.net xml c#-4.0

大家好我想从asp.net中的xml文件中获取前5条记录..请告诉我我该怎么做才能从xml中获取这样的数据

这是我的重复器Markup我将我的数据与重复器中的eval标签绑定

<asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
  <!-- content -->

      <div class="post">
        <div class="right">
          <h2><a href="#">
              <asp:Label ID="lbltitle" runat="server" Text='<%#Eval("title ") %>'></asp:Label></a></h2>
            <asp:Label ID="lblcontent" runat="server" Text='<%#Eval("Discription") %>'></asp:Label>
        </div>
        <div class="left">

          <p class="dateinfo">
          <asp:Label ID="lbldate"
                  runat="server" Text='<%#Eval("DT") %>'></asp:Label>
              <span><asp:Label ID="lblmnth" runat="server" Text='<%#Eval("mnt") %>'></asp:Label></span></p>
          <div class="post-meta">
            <h4>Post Info</h4>
            <ul>
              <li class="user"><a href="#">Erwin</a></li>
              <li class="time"><a href="#">12:30 PM</a></li>
              <li class="comment">
                  <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                  <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/PostComment.aspx"   >Comments</asp:HyperLink></li>
              <li class="permalink"><a href="#">Permalink</a></li>
            </ul>
          </div>
        </div>
      </div>


    </ItemTemplate>
        </asp:Repeater>

C#代码

 var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));
    var result = doc.Descendants("post").Where(x => x.Element("id") != null).Select(x => new
    {
        id = x.Element("id").Value,
        title = x.Element("title").Value,
        Description = 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();

4 个答案:

答案 0 :(得分:1)

尝试使用LINQ - 现在看到了XML,添加了允许空帖的位置

var doc = XDocument.Load(@"c:\temp\test.xml");
var result = doc.Descendants("post").Where(x=>x.Element("id") != null).Select(x=>x).OrderByDescending(x=>int.Parse(x.Element("id").Value)).Take(5);

如果你想更进一步,你可以从结果中创建一个匿名类型,如此(我必须在描述中复制你的拼写错误才能使它工作)

var doc = XDocument.Load(Server.MapPath("~/test.xml"));
var result = doc.Descendants("post").Where(x => x.Element("id") != null).Select(x => new
{
    id = x.Element("id").Value,
    title = x.Element("title").Value,
    Description = 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);

答案 1 :(得分:0)

这可能会帮助您直接从xmlDocument选择TOP 5记录。

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString);

XmlNodeList xNodeList = xml.SelectNodes("/content/post[position() <= 5]");

现在,您可以迭代xNodeList以获取post标记内的特定值。

您还可以从数据表中选择TOP N记录,然后Linq将是更好的选项

dt.AsEnumerable().Take(5);

答案 2 :(得分:0)

您可以尝试将数据加载到XmlDocument中,然后使用SelectNodes方法创建一个XmlNode列表:

XmlDocument Document = new XmlDocument();
XmlNodeList XNList;
        try
        {
            openFileDialog1.ShowDialog();
            Document.Load(openFileDialog1.FileName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        XNList = Document.SelectNodes("RootNode/Node");            

这样你就可以使用List了,并且可以通过列表中的索引或者使用任何循环来访问前n个节点。

答案 3 :(得分:0)

尝试以下

            // load xml
        var xmlDoc = System.Xml.Linq.XDocument.Load("[XML PATH]");

        // get root with name ArrayOfActivity
        var items = xmlDoc.Elements("ArrayOfActivity").FirstOrDefault();

        // get top 5 
        var top5 = items.Elements().OrderBy(x=>x.Elements("Id")).Take(5);

        // loop children
        foreach (var x in items.Elements())
        {
            Console.WriteLine(x.Value);
        }

然后你可以像这样绑定列表(从上面取top5作为数据源):

            // if you want you can bind the list to a datagrid
        DataGrid dg = new DataGrid();
        dg.DataSource = top5;
        dg.DataBind();

要使用您的示例,请使用以下代码

System.Xml.Linq.XDocument xd = new System.Xml.Linq.XDocument("<?xml version='1.0' encoding='utf-8'?> <content> <post> </post> <post> <id>1</id> <title>fds</title> <Discription>fdsafsdf</Discription> <dt>21</dt> <mnt>6</mnt> <yr>2013</yr> </post> </content>");

        // Get all posts
        var items = xd.Elements("posts").OrderBy(x=>x.Elements("[Id]")).Take(5);