-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

投稿されたコードにはいくつかの問題があります。

  1. これはすでにコレクションを返すため、AsEnumerable()onを使用する必要はありません。XDocument.Descendants(XName)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 要素の値を持つ匿名型のコレクションを返します。Name 属性を取得するために Browser 要素が使用されていることに注意してください。

その後、このコレクションをループできます。

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 に答える
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 に答える