我正在阅读网站上的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
答案 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)
我刚刚完成了他的样本,以执行你的例子......
我的“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();
}
}
}