遇到特定标签时如何 select 子标签?

How do I select the child tag when specific tag is encountered?

如何为遇到的每个 <lle:tweet> 标签获取标签 <lle:lat><lle:long> 的值?当前的 C# 代码仅获取第一个 <lle:tweet> 标记的 <lle:lat><lle:long> 值,并且会重复。不使用 XPath,仅 LINQ 到 XML

因为 xml 文件中只有 2 个 <lle:tweet> 标签

预期输出:

Latitude:123
Longitude:456
Latitude:434
Longitude:554

当前输出:

Latitude:123
Longitude:456
Latitude:123
Longitude:456
Latitude:123
Longitude:456

下面是 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>
                <lle:Event>
                    <lle:eventid>ID3</lle:eventid>
                    <lle:tweet>
                        <lle:text>This is some tweet in my day</lle:text>
                        <lle:location>
                            <lle:lat>434</lle:lat>
                            <lle:long>554</lle:long>
                        </lle:location>
                    </lle:tweet>                              
                </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 tweetElements = from tweetTag in xmldoc.Descendants(nlle + "Event")
                                select tweetTag.Element(nlle + "tweet");

foreach (var twitElem in tweetElements)
            {          
                var lati = xmldoc.Descendants(nlle + "tweet")
                            .Descendants(nlle + "lat")
                            .FirstOrDefault()?.Value;

                var lng = xmldoc.Descendants(nlle + "tweet")
                            .Descendants(nlle + "long")
                            .FirstOrDefault()?.Value;

                Console.WriteLine("Latitude:{0}", lati);
                Console.WriteLine("Longitude:{0}", lng);
            }

您可以通过从 tweet 向下钻取在一个语句中投影 lat/lon 对:

XDocument xmldoc = XDocument.Load("...file here...");
XNamespace nlle = "http://www.aab.org/lifelogevents";
XNamespace soapenv = "http://www.w3.org/2001/12/soap-envelope";
    
var latlons = from tweetTag in xmldoc.Descendants(nlle + "tweet")
   .Descendants(nlle + "location") 
   select new { Lat = tweetTag.Element(nlle + "lat").Value, Lon = tweetTag.Element(nlle + "long").Value};