1

私は次のXMLを持っています

<Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00085</Guid>
    </Log>
</Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00086</Guid>
    </Log>
</Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00087</Guid>
    </Log>
</Log>
</Log>

Guid を検索するときに、2 番目の要素の Log 以下を返したいと思います。

<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00085</Guid>
    </Log>
</Log>

linq to xml を使用してさまざまな方法を試しましたが、うまくいかないようです。誰か助けてもらえますか?

    XElement Log = XElement.Parse(responseXml)
    .Elements("Log")
    .Where(x => x.Element("Guid").Value == "16fea409-58cc-e211-9b7f-005056b00085")
    .FirstOrDefault();
4

1 に答える 1

1

Linq と XPath を使用してこれを行うことができます (System.Xml.XPath名前空間への参照を追加します)。

var guid = "16fea409-58cc-e211-9b7f-005056b00086";
var log = xdoc.XPathSelectElements("//Log[Log/Guid]")
              .Where(g => (string)g.XPathSelectElement("Log/Guid") == guid)
              .FirstOrDefault();

式は、内部要素を持つ少なくとも 1つの子を持つ//Log[Log/Guid]すべての要素を選択します。上記のコードは次を返します。LogLogGuid

<Log>
  <Log></Log>
  <Log>
    <Guid>16fea409-58cc-e211-9b7f-005056b00086</Guid>
  </Log>
</Log>

または、単純な Linq を使用します。プロパティを使用できます。ただし、この場合、すべてのGuid要素が少なくとも 2 つのLog要素内にのみネストされていることを確認する必要があります。

var guid = "16fea409-58cc-e211-9b7f-005056b00086";
var log = xdoc.Descendants("Guid")
              .Where(g => (string) g == guid)
              .Select(g => g.Parent.Parent)
              .FirstOrDefault();
于 2013-06-03T14:44:52.147 に答える