C # определить, имеет ли один из дочерних элементов определенное значение в XElement - PullRequest
0 голосов
/ 06 декабря 2018

Пожалуйста, примите во внимание это XML:

<MyRoot>
    <c1>0</c1>
    <c2>0</c2>
    <c3>0</c3>
    <c4>0</c4>
    <c5>1</c5>
    <c6>0</c6>
    <c7>0</c7>
    <c8>0</c8>
</MyRoot>

Как мне написать лямбда-выражение, чтобы узнать, имеет ли одно из дочерних элементов MyRoot значение 1?

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Для VB'еров, желающих получить ответ

    Dim xe As XElement
    'xe = XElement.Load("URI here")

    'for testing use literals
    xe = <MyRoot>
             <c1>0</c1>
             <c2>0</c2>
             <c3>0</c3>
             <c4>0</c4>
             <c5>1</c5>
             <c6>0</c6>
             <c7>0</c7>
             <c8>0</c8>
         </MyRoot>

    'any child = 1
    Dim ie As IEnumerable(Of XElement) = From el In xe.Elements Where el.Value = "1" Select el

    'check c4 for 1
    ie = From el In xe.<c4> Where el.Value = "1" Select el
    'or
    If xe.<c4>.Value = "1" Then
        '
    End If
0 голосов
/ 07 декабря 2018
string x = @"<MyRoot>
                <c1>0</c1>
                <c2>0</c2>
                <c3>0</c3>
                <c4>0</c4>
                <c5>1</c5>
                <c6>0</c6>
                <c7>0</c7>
                <c8>0</c8>
            </MyRoot>";
XElement xml = XElement.Parse(x);
bool has_one = xml.Elements().Any(z => z.Value == "1");
0 голосов
/ 06 декабря 2018

Это довольно тривиально с использованием класса XDocument и некоторого linq, который будет выглядеть следующим образом:

string xml=@"<MyRoot>
    <c1>0</c1>
    <c2>0</c2>
    <c3>0</c3>
    <c4>0</c4>
    <c5>1</c5>
    <c6>0</c6>
    <c7>0</c7>
    <c8>0</c8>
</MyRoot>";

     XDocument Doc = XDocument.Parse(xml);
     var nodes = from response in Doc.Descendants()
                 where response.Value == "1" 
                 select new {Name = response.Name, Value = response.Value };

    foreach(var node in nodes)
          Console.WriteLine(node.Name + ":  " + node.Value);

Посмотрите на работающую DEMO Fiddle как пример

с лямбдой:

var nodes = Doc.Descendants().Where(x=> x.Value == "1")
                           .Select(x=> {Name = x.Name, Value = x.Value });

Теперь вы можете выполнить итерацию:

foreach(var node in nodes)
      Console.WriteLine(node.Name + ":  " + node.Value);
...