在正确读取XML时遇到困难

本文关键字:遇到 XML 读取 | 更新日期: 2023-09-27 18:18:35

我正在阅读网站上的XML文件。通道的名称及其"id"存储在.txt文件中,并在读取XML页面时使用。这是为我工作的代码,没有问题own3d.tv:

public void checkOnline()
{
    try
    {
        XmlTextReader reader = new XmlTextReader("http://api.own3d.tv/liveCheck.php?live_id=" + OTVid);
        bool done = false;
        while (reader.Read() && !done)
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Text:
                    if (OTVstreamOnline != bool.Parse(reader.Value) && !OTVoverridden)
                    {
                        OTVstreamOnline = bool.Parse(reader.Value);
                        if (OTVstreamOnline)
                        {
                            OTVonlineStreams++;
                        }
                        else
                        {
                            OTVonlineStreams--;
                        }
                        OTVAnnounce();
                    }
                    break;
                case XmlNodeType.EndElement:
                    done = true;
                    Console.WriteLine(OTVnick + " online = " + OTVstreamOnline);
                    break;
            }
        }
    }
    catch (XmlException)
    {
        Console.WriteLine("File not found.");
    }
}

当读取它是XML时,它是这样的:

<own3dReply>
 <liveEvent>
  <isLive>true</isLive>
  <liveViewers>96</liveViewers>
  <liveDuration>115046</liveDuration>
 </liveEvent>
</own3dReply>

效果很好。这样做的全部目的是检查isLive是否为真,然后OTVonlineStreams++;否则如果为false OTVonlineStreams——;

然而,我需要使用http://api.justin.tv/api/stream/list.xml?channel=,我正在努力用我上面使用的方法做到这一点。联机时的xml文件如下所示:

<streams>
 <stream>
  <broadcast_part>1</broadcast_part>
  <featured>True</featured>
  <channel_subscription>False</channel_subscription>
  <audio_codec>mp3</audio_codec>
  <embed_count>253</embed_count>
  <id href="/stream/show/2281837264.xml">2281837264</id>
  <category>gaming</category>
  <title>EG's DeMoN - Streaming DotA 2</title>
  <video_height>720</video_height>
  <site_count>116</site_count>
  <embed_enabled>True</embed_enabled>
  <up_time>Wed Dec 21 03:43:00 2011</up_time>
  <meta_game>Dota 2</meta_game>
  <format>live</format>
  <stream_type>live</stream_type>
  <channel_count>648</channel_count>
  <abuse_reported>False</abuse_reported>
  <video_width>1280</video_width>
  <geo>MY</geo>
  <name href="/stream/show/live_user_dotademon.xml">live_user_dotademon</name>
  <language>en</language>
  <stream_count>369</stream_count>
  <video_bitrate>1720.34375</video_bitrate>
 </stream
</streams>

脱机时,XML只是:

<results/>

我该如何使用justin ?就像我用own3d做的那样。电视吗?所有的贾斯汀。真正需要做的是检查是否有<results/>以外的XML,如果有,做OTVonlineStreams++等。我不知道从哪里开始,我已经尝试了许多其他的方法来阅读文件,我可以,但后来我很难更新我所有的东西,如otvonlinestreams++等。

我知道这不是专门问这类问题的地方,也不是让别人帮我问的地方,但我真的想不明白。我正在学习c#,所以请对我宽容一点:]所以主要的问题是,我如何阅读justin。就像我在own3d.tv上做的那样吗?

这里有一个链接到pastebin,其中包含我正在谈论的整个文件的内容:http://pastebin.com/hZex2UBg

在正确读取XML时遇到困难

为您自己的3d。在这里,您可以使用LINQ一行代码,而不是手动解析XML;

int count = (from e in doc.Descendants("isLive") where (bool)e select e).Count();

对于您的第二个请求,尝试这个;

int count = doc.Descendants("stream").Count();

查看这里的XDocument文档(上面的例子中就是doc);http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx

我不确定我的理解是否正确,但我认为XSLT转换可以帮助您。

这意味着,您正在为每个电视服务使用转换,该转换将特定于提供者的XML转换为您的代码可以使用的标准化XML格式。

这样,你可以很容易地添加其他提供程序,你的代码保持不变,不管你使用哪个提供程序。好的好处是你跳过了所有你不需要的数据,你可以在转换中做简单的计算/条件检查。这样可以检查节点<results/>是否存在,然后输出<isLive>true</isLive><isLive>false</isLive>

请看这里:http://www.w3schools.com/xsl/

还有一个将XML转换为XML的例子:http://en.wikipedia.org/wiki/XSLT Example_1_.28transforming_XML_to_XML.29

如前所述,您应该像c.m atakney所说的那样使用Linq over -liner。

我刚刚完成了他的样本,以执行您的示例…

my "sample. XML "取你的XML样本…希望对你有帮助:)

using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace xmlRead
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create("sample.xml");
            XDocument myDoc = XDocument.Load(reader);
            //checking if theire a results element ?
            int count = myDoc.Descendants("results").Count();
            if (count == 0)
            {
                //do what your programs does to do
                //for example reading embed_enabled and put in variable declared before :)
                XElement embededEnabled = (from xml2 in myDoc.Descendants("embed_enabled") select xml2).FirstOrDefault();
                Console.WriteLine("item to: {0}", embededEnabled);
            }
            Console.ReadLine();
        }
    }
}