它在Alexa XML文件中有2个元素
本文关键字:元素 COUNTRY 2个 Alexa XML 文件 它在 | 更新日期: 2023-09-27 18:32:59
像往常一样,我使用以下代码来获取Alexa越南排名,越南排名在元素中:
<COUNTRY CODE="VN" NAME="Vietnam" RANK="20"/>
这里只有一个元素<COUNTRY>
。
private int GetAlexaRank(string domain)
{
var alexaRank = 0;
try
{
var url = string.Format("http://data.alexa.com/data?cli=10&dat=snbamz&url={0}", domain);
var doc = XDocument.Load(url);
var vnrank = doc.Descendants("COUNTRY").Select(node => node.Attribute("RANK").Value).FirstOrDefault();// Vietnam Rank
if (!int.TryParse(vnrank, out alexaRank))
alexaRank = -1;
}
catch (Exception e)
{
return -1;
}
return alexaRank;
}
但在这种情况下,它有两个要素:越南等级在secound元素中,我怎样才能得到它?
alexaRank = doc.Descendants("COUNTRY")
.Select(c => (int?)c.Attribute("RANK"))
.Where(r => r.HasValue)
.FirstOrDefault() ?? -1;
工作原理:所有COUNTRY
子体都是从 XML 响应中选择的(无论这些元素在 XML 中的位置如何)。然后从每个国家/地区元素中选择属性RANK
并将此属性转换为可为空的整数。如果国家/地区没有排名属性或此属性的值,这将null
。然后我们从排名属性值中选择第一个或默认值。如果什么也没找到,那么它给了我们一个null
.使用零合并运算符??
我们分配-1
而不是null
。如果找到某些内容,则可为空的整数的值将分配给alexaRank
。
因此,您不会在此处获得解析异常 - 如果未找到国家/地区节点,或者没有具有 rank 属性的国家/地区节点(好吧,仅当排名不是整数时)。但是您仍然可能会遇到其他异常,例如如果网络不可用,则会出现错误。所以,你可以在这里保留try catch
。但不要吞下例外!您应该记录它。
您也可以使用 XPath:
private int GetAlexaRank(string domain)
{
try
{
var doc = XDocument.Load(url);
var country = xdoc.XPathSelectElement("//COUNTRY[@RANK]");
if (country == null)
return 0;
return (int)country.Attribute("RANK");
}
catch (Exception e)
{
// Log exception here!
return -1;
}
}