2013-08-06 30 views
-3

您好我有XML像下面LINQ查詢如何將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() 
           }); 

我一直沒有得到枚舉產量結果..

+0

您是否已將該美容加載到「XDocument」中? –

+0

是的,我把它作爲上面xml asthanarht

+0

請編輯您的文章,以包括您的Linq XML代碼。 –

回答

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()是沒有必要的

+0

不返回任何值:( – asthanarht

+0

給出「枚舉不會產生任何結果」 – asthanarht

+0

也許按照您所做的方式加載文檔並不需要'Root'。試試讓我知道。看起來@Tim沒有使用'Root'並且這可能是問題... ??? – IAbstract

1

沒有與您發佈的代碼的幾個問題:

  1. 您不需要在上使用,因爲這已經返回IEnumerable<XElement>集合。

  2. 您需要指定具有要查找的屬性的元素;由於您從名爲Root的所有元素的集合開始,因此它將在Root中查找這些屬性。

  3. .Value返回一個字符串,所以不需要調用.ToString()就可以了。

你沒有得到任何結果的原因是因爲#2(在根上沒有百分比或名稱屬性)。

試試這個:

// 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 
        }; 
+0

沒有運氣..給出結果爲「枚舉沒有結果」 – asthanarht

+0

你如何創建XDocument?我測試了代碼上面用你發佈的XML和它按預期工作 - 我得到了3個對象的集合 – Tim

+0

我在我的代碼中添加了一行來顯示我如何爲我的測試創建了XDocument – Tim