【问题标题】:How do I select the child tag when specific tag is encountered?遇到特定标签时如何选择子标签?
【发布时间】:2021-09-14 09:24:24
【问题描述】:

对于遇到的每个 <lle:tweet> 标签,我如何获取标签 <lle:lat><lle:long> 的值?当前的 C# 代码仅获取第一个 <lle:tweet> 标记的 <lle:lat><lle:long> 值,并且重复。不使用 XPath,只使用 LINQ to 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);
            }

【问题讨论】:

  • 有什么问题?当我运行你的代码时,我得到了经纬度。
  • 顺便说一下,在使用 SOAP 时,您通常使用生成的客户端,而无需关心 xml。您是否有理由不为这项服务与肥皂客户合作?或者......使用他们的 REST api?
  • @Crowcoder 它只显示第一个“tweet”标签经纬度及其重复

标签: c# xml linq linq-to-xml


【解决方案1】:

您可以通过从tweets 向下钻取在一个语句中预测纬度/经度对:

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};

【讨论】:

  • 应该是:来自 xmldoc.Descendants().Where(x => x.name.LocalName == "location") 中的 tweetTag
  • @jdweng 因为我使用的是不需要“LocalName”的命名空间。该代码有效。
  • 你不是 OP,也没有提供包含命名空间的汽化代码。
  • @jdweng 我认为如果你读了这个问题就很明显了,但是好的,我会编辑
  • @Crowcoder 代码选择了所有的经纬度,它采用&lt;lle:instagram-post-update&gt; 经纬度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多