它在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元素中,我怎样才能得到它?

它在Alexa XML文件中有2个元素<COUNTRY>

 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;
    }
}