大家好我想从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();
答案 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);