【问题标题】:Trying to read xml from a file not ending with .xml尝试从不以 .xml 结尾的文件中读取 xml
【发布时间】:2013-05-31 23:01:51
【问题描述】:

我正在尝试从体育赔率源中读取 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
            }
        }

【问题讨论】:

  • 完整的错误是什么?为什么不使用 LINQ to XML?
  • 未处理异常:System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。位于 System.Xml.XmlTextReaderImpl.Throw(String res, String arg) 处 System.Xml.XmlTextReaderImpl.Throw(Exception e) 处 System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() 处 System.Xml.XmlTextReaderImpl。 ParseDocumentContent() at System.Xml.XmlTextReaderImpl.Read() at Bet_At_Home.Program.Main(String[] args) in c:\users\hello world\documents\ visual studio 2010\Projects\...
  • @Axel 该错误表明我之前的评论不正确。它正在获取something(也可能是错误响应!),但获取的数据似乎是格式错误的XML(包括HTML,它不是XML! )。
  • 在浏览器 (IE) 中测试您的链接生成了看似有效的 XML - 但是,调用该 URI 之间有 60 秒的延迟。您是否每 60 秒多次调用此 URI?通过在两次尝试之间等待 60 多秒,我能够让您的代码示例正常工作。

标签: c# asp.net xml feed xmlreader


【解决方案1】:

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

【讨论】:

  • 非常感谢,会试试的。
  • @Axel np,对不起,我的回答没有提供更多细节,但我认为错误与 xml 读取无关。如果您想测试它,请将响应复制并粘贴到文本文件中,将其保存在本地,然后查看您的 xml 读取逻辑是否有效。之后,您可以实现 http 部分。通常,将您的问题分解成更小的部分并首先处理最重要的部分会很有帮助,在这种情况下,我可能会忽略 http GET,直到您实现了 xml 阅读器并确认它可以工作。
  • 不太可能提供帮助,因为XmlReader 已经正确地从 Uri 下载数据。 Url 返回的最有可能的数据根本不是 XML(Fiddler 可以轻松显示应用程序发送/接收的数据,类似于浏览器)
  • @AlexeiLevenkov 所以 HttpWebRequest 不起作用?实际上 uri 在 w3c 验证为 xml。
  • @Axel - 它可能会有所帮助,因为您可以完全控制标头/能够使用正确的编码进行响应。您需要查看实际返回的响应以及是否是您期望的响应。
【解决方案2】:

这只是一种预感,但如果您尝试访问该 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

【讨论】:

  • 非常感谢!我会尝试使用 LINQ。再次感谢!
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多