【问题标题】:Select value in Xelement within Xelement?在Xelement中选择Xelement中的值?
【发布时间】:2011-08-21 08:49:32
【问题描述】:

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

通过下一个代码,我能够将名称、代码和网站输入到每个品牌组中每个品牌的 Class Station 和对象。


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 相关的东西,但我无法让它工作。

有没有人知道方法?

顺便说一句,我真的不知道如何在这里突出显示代码和东西,我希望它有效,否则我真的很抱歉......

【问题讨论】:

  • 您使用哪种语言?

标签: c# xml linq-to-xml


【解决方案1】:

如果您真的只想要 URL,您可以执行以下操作(假设它是 Station 上称为 StreamUrlsIEnumerable&lt;string&gt;(或 string[])类型的属性):

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 更好。)

【讨论】:

  • 在选择新站时,我从未尝试进行其他查询。这就是我在凌晨 3 点应该睡着的时候尝试解决问题的结果。不错的解决方案:)
  • 效果很好,非常感谢!现在它仍然是一个字符串值,使它成为一个枚举是为了在我让应用程序真正工作之后:p
【解决方案2】:

希望有用

    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>

【讨论】:

  • 我不知道站名应该是&lt;name&gt;blabla&lt;/name&gt;,这是你的代码打印出来的。
  • 这只是一个示例,我的意思是您可以将您的独特项目设置为按键分组...然后轻松安全地访问streamurl...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多