在正确读取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
为您自己的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();
}
}
}