0

我正在尝试从体育赔率提要中读取 xml,但无法正常工作。我正在使用 xmlReader.Create(url),但我得到的只是根级别的数据无效-错误。这是代码的样子:

        XmlReader reader = XmlReader.Create("http://www.bet-at-home.com/oddxml.aspx");

        while (reader.Read())
        {

            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "oo"))
            {
                //bla bla
            }
        }
4

2 回答 2

1

您需要发出 httprequest 来获取数据。您不能只为该方法提供一个 url 并期望它像本地文件一样对待它。首先发出一个 http 请求并将响应保存在一个字符串中,然后您可以像 xml 一样处理它。这是HttpWebRequest.NET的链接http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

于 2013-05-31T23:04:57.117 回答
0

这只是一种预感,但如果您尝试访问该 URI 的频率超过 60 秒,您会收到以下消息:

`Please use a minimum interval of 60 sec (please wait for 10,65625 sec).` 

由于此响应显然不是 XML,XmlReader因此无法对其进行任何操作。

只要连接之间有 60 秒或更长时间,我就能成功运行您的代码。

补充几点:

  1. 您的 if 条件不会获得您正在寻找的节点 - XML 区分大小写。它应该是这样的:

    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "OO"))

  2. LINQ to XML 将是一种更简单(在我看来)的方法:

LINQ to XML 示例

using System.Xml.Linq;

// This loads the XML from the specified URI into the XDocument
XDocument xDoc = XDocument.Load("http://www.bet-at-home.com/oddxml.aspx");

// This query will return a collection of all the "OO" elements (and their children)
var oo = from x in xDoc.Descendants("OO")
         select x;

// You can iterate through this collection and do what you want
foreach (XElement ele in oo)
{
    // do something with each OO group
}

或者,您可以从查询中返回匿名类型(或定义的类型)。例如:

var oo = from x in xDoc.Descendants("OO")
         select new
         {
             Sport = x.Element("Sport").Value,
             Category = x.Element("Category").Value,
             Tournament = x.Element("Tournament").Value,
             Date = x.Element("Date").Value
             // and so on
         };

然后,您将拥有可以迭代的这些匿名类型的集合。

如果您定义了一个要在其中保存数据的类(例如 BettingOdds),则只需使用该类,该select new行将变为select new BettingOdds.

请注意,您需要检查以确保您引用的元素存在,否则您将获得空引用异常。

互联网上有大量关于您可以使用 LINQ to XML 做什么的示例 - 这是一个示例 - LINQ To XML Tutorials with Examples

于 2013-06-01T01:56:01.097 回答