2011-08-21 95 views
0

對於Windows Phone中的Webradio應用程序,我試圖用數據讀取XML文件,但是我遇到了特定字段的問題。 XML文件看起來是這樣的:在Xelement中選擇Xelement中的值?

<brands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <brandgroup> 
     <brand> 
      <code>blabla</code> 
      <name>blabla</name> 
      <logo>blabla</logo> 
      <websiteurl>blabla</websiteurl> 
      <audiostreams> 
       <audiostream streamurl="www.1.mp3" codec="mp3" streamrate="low"/> 
       <audiostream streamurl="www.2.mp3" codec="mp3" streamrate="med" default="true"/> 
       <audiostream streamurl="www.3.mp3" codec="mp3" streamrate="high"/> 
      </audiostreams> 
     </brand> 
     <brand> 
     </brand> 
    </brandgroup> 
    other 'brandgroups' with other 'brand' 
</brand> 

帶班站的每一個品牌每brandgroup境內的下一個代碼我的能力得到名稱,代碼和網站進入和對象。


XDocument loadedData = XDocument.Load("netten.xml"); 
var data = from query in loadedData.Descendants("brand") 
      select new Station 
      { 
       Name = (string)query.Element("name"), 
       Code = (int)query.Element("code"), 
       Website = (string)query.Element("websiteurl"), 
      }; 

不過,我不能找到一個辦法讓語音串流。有'audiostreams'元素至少有3個孩子的'audiostream'元素,我需要'streamurl'。

最好是存儲3個流水,以便我可以在以後改變質量。然後,我應該需要在Class Station中有一個字段:

String[] streamurls = {www.1.mp3, www.2.mp3, www.3.mp3}; 

並將3個信息流存儲在那裏以供稍後選擇。我已經嘗試了一些與XML,Attribute和XElement相關的東西,但是我無法讓它工作。

有沒有人知道方法?

順便說一句我真的不明白如何突出代碼和東西在這裏,我希望它的工作原理,otherwse我真的很抱歉...

+0

您使用哪種語言? –

回答

2

如果你真的只想要的網址,你可以這樣做(假設爲IEnumerable<string>類型的屬性(或string[])呼籲StreamUrlsStation):

from brand in loadedData.Descendants("brand") 
select new Station 
{ 
    Name = (string)brand.Element("name"), 
    Code = (int)brand.Element("code"), 
    Website = (string)brand.Element("websiteurl"), 
    StreamUrls = brand.Element("audiostreams") 
       .Elements("audiostream") 
       .Attributes("streamurl") 
       .Select(a => a.Value) 
       .ToArray() 
} 

如果你想從audiostream元素等信息,聲明一個類,如:

class Stream 
{ 
    public string Url { get; set; } 
    public string Codec { get; set; } 
    public string Rate { get; set; } 
    public bool IsDefault { get; set; } 
} 

然後查詢看起來像:

from brand in loadedData.Descendants("brand") 
select new Station 
{ 
    Name = (string)brand.Element("name"), 
    Code = (int)brand.Element("code"), 
    Website = (string)brand.Element("websiteurl"), 
    Streams = 
     (from stream in brand.Element("audiostreams").Elements("audiostream") 
     select new Stream 
     { 
      Url = (string)stream.Attribute("streamurl"), 
      Codec = (string)stream.Attribute("codec"), 
      Rate = (string)stream.Attribute("streamrate"), 
      IsDefault = (string)stream.Attribute("default") == "true" 
     }).ToArray() 
} 

(如果CodecRate只能有一定的價值,表達他們作爲enum會比string更好)

+0

我從來沒有嘗試過在選擇新的電臺時做另一個查詢。這就是我在凌晨3點嘗試解決問題時應該睡着的原因。很好的解決方案:) – Tim

+0

就像一個魅力,非常感謝你!現在它仍然是一個字符串值,使它成爲一個枚舉後,我得到的應用程序實際工作:p – Mathieu

0

希望它是有用的

static void Main(string[] args) 
    { 
     XDocument loadedData = XDocument.Load("netten.xml"); 
     var data = from query in loadedData.Descendants("brand") 
        group query by new { A = query.Element("name"), B = query.Element("code"), C = query.Element("websiteurl"), D = query.Element("audiostreams") } into g 
        select new 
        { 
         Name = g.Key.A + "", 
         Code = g.Key.B + "", 
         Website = g.Key.C + "", 

         AudioStreams = g.Key.D.Elements("audiostream") 
               .Attributes("streamurl") 
               .Select(x => x.Value) 
               .ToArray() 

        }; 


     foreach (var x in data) 
     { 
      Console.WriteLine(x.Name); 
      Console.WriteLine(x.Code); 
      Console.WriteLine(x.Website); 

      foreach (var url in x.AudioStreams) 
       Console.WriteLine(url); 
     } 


     Console.ReadKey(); 
    } 
} 

的xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
<brands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <brandgroup> 
    <brand> 
     <code>blabla</code> 
     <name>blabla</name> 
     <logo>blabla</logo> 
     <websiteurl>blabla</websiteurl> 
     <audiostreams> 
     <audiostream streamurl="www.1.mp3" codec="mp3" streamrate="low"/> 
     <audiostream streamurl="www.2.mp3" codec="mp3" streamrate="med" default="true"/> 
     <audiostream streamurl="www.3.mp3" codec="mp3" streamrate="high"/> 
     </audiostreams> 
    </brand> 
    </brandgroup> 
    <brandgroup> 
    <brand> 
     <code>blabla2</code> 
     <name>blabla2</name> 
     <logo>blabla</logo> 
     <websiteurl>blabla2</websiteurl> 
     <audiostreams> 
     <audiostream streamurl="www.4.mp3" codec="mp3" streamrate="low"/> 
     <audiostream streamurl="www.5.mp3" codec="mp3" streamrate="med" default="true"/> 
     <audiostream streamurl="www.6.mp3" codec="mp3" streamrate="high"/> 
     </audiostreams> 
    </brand> 
    </brandgroup> 
</brands> 
+0

我不站的名稱應該是' blabla',這是你的代碼打印。 – svick

+0

這只是一個樣本,我的意思是你可以設置你的獨特的項目按鍵組... ...然後開始流暢輕鬆和安全... – shenhengbin