2011-08-21 42 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