-3

嗨,我有如下 xml

 <BrowserMix>
            <BrowserProfile Percentage="10">
              <Browser Name="Internet Explorer 10.0" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
            <BrowserProfile Percentage="85">
              <Browser Name="Internet Explorer 9.0" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
            <BrowserProfile Percentage="5">
              <Browser Name="WinPhone8" MaxConnections="6">
                <Headers>
                  <Header Name="User-Agent" Value="Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)" />
                  <Header Name="Accept" Value="*/*" />
                  <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
                  <Header Name="Accept-Encoding" Value="GZIP" />
                </Headers>
              </Browser>
            </BrowserProfile>
          </BrowserMix>

我想使用 linq 查询获取“百分比”和浏览器名称的值属性?提前致谢?

而Linq查询是

 var browserQuery = (from dt in xdoc.Descendants("Root").AsEnumerable()
                               select new
                               {
                                   BrowserMix = dt.Attribute("Percentage").Value.ToString(),
                                   Name = dt.Attribute("Name").Value.ToString()
                               });

我总是没有得到枚举产量结果..

4

2 回答 2

1
// untested 
var browserQuery = xdoc.Root.Descendants("BrowserProfile")
                       .Select(dt => new {
                          BrowserMix = dt.Attribute("Percentage").Value,
                          Name = dt.Element("Browser").Attribute("Name").Value
                       });

需要注意的几点:

  • 开始查询.Root

  • DescendantsElements返回IEnumerable<XElement>,所以你不需要包括.AsEnumerable()

  • XElement.Value属性默认返回字符串,所以.ToString()没有必要

于 2013-08-06T20:01:41.170 回答
1

您发布的代码存在一些问题:

  1. 您不需要使用AsEnumerable()on XDocument.Descendants(XName),因为这已经返回了一个IEnumerable<XElement>集合。

  2. 您需要指定具有您要查找的属性的元素;由于您从名为 Root 的所有元素的集合开始,它将在 Root 中查找这些属性。

  3. .Value返回一个字符串,因此无需调用.ToString()它。

您没有得到任何结果的原因是因为#2(Root 上没有 Percentage 或 Name 属性)。

试试这个:

// xml is a string containing the xml posted in the question
XDocument xdoc = XDocument.Parse(xml);

var browserQuery = from dt in xdoc.Descendants("BrowserProfile")
                   select new
                   {
                       Percentage = dt.Attribute("Percentage").Value,
                       Name = dt.Element("Browser").Attribute("Name").Value
                   };

这段代码的作用是:

  1. 获取所有 BrowserProfile 元素(及其子元素)的集合。
  2. 它返回一个匿名类型集合,该集合具有 Percentage 属性的值和 Name 元素的值。请注意,Browser 元素用于获取 Name 属性。

然后,您可以遍历此集合:

for each (var browser in browserQuery)
{

    Console.WriteLine("Browser {0} has {1} percent", browser.Name, browser.Percentage);
}

编辑

要处理命名空间,请XNamespace像这样使用:

XNamespace ns = "microsoft.com/schemas/VisualStudio/TeamTest/2010";

然后在元素名称之前添加它:

var browserQuery = from dt in xdoc.Descendants(ns + "BrowserProfile")
                   select new
                   {
                       Percentage = dt.Attribute("Percentage").Value,
                       Name = dt.Element(ns + "Browser").Attribute("Name").Value
                   };
于 2013-08-06T20:04:18.077 回答