正确阅读XML有困难

时间:2011-12-21 13:40:54

标签: c# xml

我正在阅读网站上的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 ++;否则如果错误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.tv,就像我使用own3d.tv那样?所有justin.tv真正需要做的是检查是否有除<results/>以外的XML,如果有,请执行OTVonlineStreams ++等等。我不知道从哪里开始,我已经尝试了很多其他方法阅读文件,我可以,但后来我很难更新我的所有东西,如OTVonlineStreams ++等。

我知道这不是专门问这类问题的地方,也不是某人为我做这件事的地方,但我真的无法弄清楚这一点。我正在学习C#所以请对我这么容易:]所以主要的问题是,我如何读取justin.tv,就像我使用own3d.tv一样?

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

3 个答案:

答案 0 :(得分:1)

对于你自己的3d.tv查询,这是一个很好的地方,你可以使用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

答案 1 :(得分:0)

我不确定我是否做对了,但我认为可以帮助你的是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

答案 2 :(得分:0)

如前所述,你应该使用Linq oner-liner - 正如C.McAtakney所说。

我刚刚完成了他的样本,以执行你的例子......

我的“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();
        }
    }
}