2013-05-31 67 views
0

我想从运动赔率Feed中读取xml,但我无法使其正常工作。 我正在使用xmlReader.Create(url),但我得到的是一个数据在根级别无效-错误。 这就是代码的样子:试图从不以.xml结尾的文件中读取xml

 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 
      } 
     } 
+0

什么是完整的错误?你为什么不使用LINQ to XML? –

+0

未处理的异常:System.Xml.XmlException:根级别的数据无效。 行1,位置1在 System.Xml.XmlTextReaderImpl.Throw(例外五) 在System.Xml.XmlTextReaderImpl.Throw(字符串RES,字符串ARG) 在系统。Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() 在System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在System.Xml.XmlTextReaderImpl.Read() 在Bet_At_Home.Program.Main(字串[] args)在C:\用户\世界你好\ documents \ visual studio 2010 \ Projects \ ... – Axel

+1

@Axel该错误表明我以前的评论不正确。它*是*提取*东西*(它也可能是一个错误响应!),但是提取的数据看起来是格式不正确的XML(包括HTML,它不是XML!)。 – user2246674

回答

1

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

+0

非常感谢,会尝试。 – Axel

+1

@Axel np,对不起,我的答案没有提供更多的细节,但我不认为这个错误是与xml的阅读。如果您想对其进行测试,请将该响应复制并粘贴到文本文件中,并将其保存到本地并查看您的xml读取逻辑的工作原理。之后,你可以实现http部分。通常,将问题分解为更小的部分并首先执行最重要的部分很有帮助,在这种情况下,我可能会忽略http GET,直到您实现了xml读取器并确认其可行。 – evanmcdonnal

+0

由于'XmlReader'已经正确地从Uri下载数据,因此帮助并不明智。很可能Url返回的数据根本不是XML(Fiddler可以很容易地显示应用程序发送/接收的数据,类似于浏览器) –

0

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

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

由于这回应显然不是XML,XmlReader对此无能为力。

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

几件事情加:

  1. 你如果条件不会得到你正在寻找的节点 - 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 
} 

Alternati诚然,你可以从查询中返回一个匿名类型(或定义类型)。例如:

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做什么,以XML在互联网上的例子 - 在这里是一个例子 - LINQ To XML Tutorials with Examples

+0

非常感谢!我会尝试使用LINQ。再次感谢! – Axel