2011-12-21 4 views
2

私はウェブサイトにあるXMLファイルを読んでいます。チャンネルの名前と "id"は.txtファイルに保存され、XMLページを読むときに使用されます。正しくXMLを読むのが難しい

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

完璧に動作します:

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の読書、それはこのようなものです:これはown3d.tvと私のために何の問題も働かないコードです。これの目的は、isLiveがtrueの場合、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だけである:私はown3dで行ったもののようjustin.tv 1を使用する方法

<results/> 

。テレビ1? justin.tvが本当に必要とするのは、<results/>以外のXMLがあるかどうかをチェックすることです.OTVonlineStreams ++などはどこから始めるのかはわかりません。どこから始めたらいいか分かりません。私はできるが、OTVonlineStreams ++などのすべてのものを更新するために苦労する。

私はこれが具体的にこのタイプの質問をする場所ではないと知っているが、これを理解する。私はC#を学んでいますので、私には簡単に行ってください:]それでは、大きな問題は、私がown3d.tvで行ったようにju​​stin.tvをどうやって読むのでしょうか?

ここで私が話している何のためにファイル全体の内容を含むペーストビンへのリンクです:、これはあなたの代わりにLINQワンライナーを使用することができる素敵な場所あなたのown3d.tvクエリの場合http://pastebin.com/hZex2UBg

答えて

1

です手動でXMLを解析する。

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

2回目のリクエストでは、これを試してください。

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

docは、上記の例ではあるものです)XDocument上のドキュメントについてはこちらをご覧ください。 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx

+0

こんにちは、ありがとう。私はそれをテストしようとしました:http://pastebin.com/EeAM0xEP 私は上記の私の例でこれをどのように使用しますか? OTVonlineStrams ++では、それは私が立ち往生する場所です、あなたが言ったように私は上記のものをどのように使っていますか? – user1104783

+0

遅く返事を申し訳ありません。これまでのおかげでありがとう。 – user1104783

+0

こんにちは@ user1104783:あなたのペーストビンリンクのコードは、あなたが期待したものを返しましたか? –

0

私はそれが正しいかどうか分かりませんが、私はあなたがXSLT変換であることを助けることができると思います。

つまり、プロバイダ固有のXMLをコードで使用できる標準化されたXML形式に変換する、それぞれのテレビサービス用の変換を使用しています。

この方法で、後で他のプロバイダを簡単に追加できます。使用しているプロバイダに関係なく、コードは同じままです。良い点は、必要のないすべてのデータをスキップして、変換で簡単な計算/条件チェックができることです。 この方法で、ノード<results/>が存在するかどうかを確認し、<isLive>true</isLive>または<isLive>false</isLive>を出力できます。C.McAtakneyが言ったように - あなたはのLINQ oner-ライナーを使用する必要があり、前にも言ったよう http://en.wikipedia.org/wiki/XSLT#Example_1_.28transforming_XML_to_XML.29

0

http://www.w3schools.com/xsl/

そしてXMLにXMLを変換するための例:

はここを見てください。私はちょうどあなたの例に実行することで彼のサンプルを完成

...

私の「sample.xmlに」あなたのサンプルXMLを取って... uは:)を助けることを願っています

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(); 
     } 
    } 
} 
関連する問題