C# 在Xelement中选择Xelement中的值?

C# 在Xelement中选择Xelement中的值?,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,对于windows Phone中的Webradio应用程序,我试图读取包含数据的XML文件,但在特定字段中遇到问题。XML文件如下所示: <brands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <brandgroup> <brand> <code>blabla</code> <name>

对于windows Phone中的Webradio应用程序,我试图读取包含数据的XML文件,但在特定字段中遇到问题。XML文件如下所示:

<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>

有了下一个代码,我就能够将每个品牌群中每个品牌的名称、代码、网站和类站的对象输入到每个品牌群中



然而,我找不到一种方法来获取音频流。有一个'audiostreams'元素,它有3个子'audiostream'元素,我需要'streamurl'

最好是存储3个streamURL,这样我可以在以后更改质量。然后我需要在类站中有一个字段:

String[] streamurls = {www.1.mp3, www.2.mp3, www.3.mp3};
并将3个streamURL存储在其中,以便以后选择。我已经尝试了一些发布在这里的与XML、属性和XElement相关的东西,但是我无法让它工作

有人知道路吗


顺便说一句,我真的不知道如何在这里突出显示代码和内容,我希望它能起作用,否则我真的很抱歉…

如果你真的只想要URL,你可以这样做(假设是一个类型为
IEnumerable
(或
string[]
)的属性,称为
StreamUrls
on
Station
):

如果要从
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()
}
(如果
Codec
Rate
只能有某些值,那么将它们表示为
enum
string
更好)

希望有用

    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>

你使用哪种语言?我在选择新电台时从未尝试过进行其他查询。这就是我在凌晨3点应该睡觉的时候试图解决问题的结果。很好的解决方案:)这很有魅力,非常感谢!现在它仍然是一个字符串值,使其成为枚举是为了在我让应用程序实际工作后使用:pI don站点的名称应该是
blablabla
,这是您的代码打印的内容。这只是一个示例,我的意思是您可以将您的唯一项设置为按键分组。。。然后轻松安全地访问streamurl。。。
    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 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>