我对ASP.NET比较陌生(是一名PHP程序员已经8年了),如果我的术语不正确,请谅解。
我目前正在使用repeater的XMLDataSource
从远程XML文件中获取数据,而且DataFile
属性是在后台代码中设置的(我根据URI参数动态更改DataFile
,例如?cat=blah等)。这很好地工作着,没有问题。
在这个repeater中有一个<asp:HyperLink>
,其URL也要在后台代码中动态更改。
现在来到问题:
如何从后台代码中查看XML节点是否为空,并如何获取非空节点的值?
我已经在这个问题上花费了大约3天的时间(搜索了几个小时),但我就是无法弄清楚这个看起来应该很简单的问题!这是我目前拥有的代码,但是当我运行CreateNavigator();
时,代码后台会出现Object reference not set to an instance of an object
的错误提示。
希望比我更熟练ASP.NET和C#的人可以轻松地发现问题或者知道我可以完成这个任务的方法?
代码
<asp:XmlDataSource ID="rssFeed" runat="server"></asp:XmlDataSource>
<asp:Repeater runat="server" DataSourceID="rssFeed" OnItemDataBound="Repeater_ItemDataBound">
<ItemTemplate>
<asp:HyperLink ID="articleURL" Text='<%#XPath("title")%>' runat="server" />
</ItemTemplate>
</asp:Repeater>
C#的代码后台
protected void Page_Load(object sender, EventArgs e)
{
// rss variables
var rssSource = "http://websiteurl.com/xmlfeed/";
var rssPath = "rss/channel/item";
var searchQueries = "?foo=bar";
string currCat = Request.QueryString["cat"];
string searchTerms = Request.QueryString["s"];
// insert categories query
if(currCat != null){
searchQueries += "&cat=" + currCat;
}
// insert search query
if(searchTerms != null){
searchQueries += "&s=" + searchTerms;
}
// load RSS file
rssFeed.DataFile = rssSource + searchQueries;
rssFeed.XPath = rssPath;
}
protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
XPathNavigator nav = ((IXPathNavigable)e.Item.DataItem).CreateNavigator();
string hyperlinkURL = nav.SelectSingleNode("link").Value;
// removed code here that changes URL to hyperlinkURL to shorten post
}