如何 select 元素的后代字符串?

How do I select the element's string of descendant?

如何 select 标记“lat”并根据我想要的“eventid”获取值“123”?例如,我想 select <lle:lat>123</lle:lat> of <lle:eventid>ID1</lle:eventid> 不使用 XPath,只是 LINQ to XML only

预期输出:

123

下面是 xml 文件:

    <soapenv:Letter xmlns:soapenv="http://www.w3.org/2001/12/soap-envelope" soapenv:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
        <soapenv:Body xmlns:lle="http://www.aab.org/lifelogevents" >
            <lle:Event>
                <lle:eventid>ID1</lle:eventid>
                <lle:tweet>
                    <lle:text>This is some tweet in my day</lle:text>
                    <lle:location>
                        <lle:lat>123</lle:lat>
                        <lle:long>456</lle:long>
                    </lle:location>
                </lle:tweet>                              
            </lle:Event>
            <lle:Event>
                <lle:eventid>ID2</lle:eventid>
                    <lle:instagram-post-update>
                        <lle:text>This is some status update in my day</lle:text>
                        <lle:location>
                          <lle:lat>789</lle:lat>
                          <lle:long>987</lle:long>
                        </lle:location>
                    </lle:instagram-post-update>
                </lle:Event>
        </soapenv:Body>
    </soapenv:Letter>

到目前为止,这是我的 C# 代码:

XDocument xmldoc = XDocument.Load(@"C:\Users\JACK\source\repos\LINQ_Learn\LINQ_Learn\xmlFile.xml");
            XNamespace lle = "http://www.aab.org/lifelogevents";
            XNamespace soapenv = "http://www.w3.org/2001/12/soap-envelope";


var lati = from data in xmldoc.Descendants(nlle + "Event")
                   where (string)data.Element(nlle + "eventid") == "ID1"
                   select data.Element(nlle + "lat").Value;

        foreach(var lat in lati)
        {
            Console.WriteLine(lat);
        }

这是一个使用 Linq 导航 xml 的解决方案。首先我们得到所有后代“事件”,然后通过定义的“eventid”值过滤它们,然后 return 它们的“lat”节点。 FirstOrDefault() return 是第一个匹配项,如果找到 none,则为空值。最后,? 符号仅在不为 null 时才用于 return 匹配值,否则会抛出异常。

var lat = xmldoc.Descendants(lle + "Event")
                    .Where(x => x.Element(lle + "eventid").Value == "ID1")
                        .Descendants(lle + "lat")
                            .FirstOrDefault()?.Value;