【问题标题】:Better way to cleanly handle nested XML with LINQ使用 LINQ 干净地处理嵌套 XML 的更好方法
【发布时间】:2009-01-08 17:21:58
【问题描述】:

我正在使用由通过嵌套级别获得报酬的人设计的 XML。不同的 xml 文件总是看起来像这样:

<Car>   
   <Color>
       <Paint>
          <AnotherUselessTag>
               <SomeSemanticBs>
                   <TheImportantData>

使用 LINQ 很容易得到我想要的:(不完全是,但你明白了)

from x in car.Descendants("x")
from y in x.Descendants("y")
from z in y.Descendants("z")
select z.WhatIWant();

我在问是否有更好的方法来做到这一点?使用 Linq 导航 DOM 的某种方式?

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果你确定你想要的只是来自Car 元素的TheImporantData 元素,并且TheImportantData 不被用作标签名,那么:-

    来自 car.Descendants("TheImportantData") 中的 x 选择 x.WhatIWant();

    会的。

    【讨论】:

    • 谢谢,我不知道。后代就是这样工作的。很好的答案。
    • 检查元素的每一个后代元素,如果您的 XML 非常大,这可能会成为问题。
    • @Robert:有趣的一点,有没有可以确认的地方。典型的 DOM 会索引元素名称,因此通过单个名称进行选择非常有效,但 Xml.Linq 并不典型。
    【解决方案2】:

    考虑XNode 扩展方法XPathSelectElements。在你的情况下:

    var foo = from x in car.XPathSelectElements("Color/Paint/AnotherUselessTag/SomeSemanticBs/TheImportantData")
    select x.WhatIWant();
    

    Descendants 方法不同,以这种方式使用 XPath 可以专门导航到您需要的元素 - 例如它只会查看Car 元素下的Color 元素,并且只查看Color 元素下的Paint 元素,依此类推。 (如果需要,您可以使用 XPath 模式 .//TheImportantData 来模拟 Descendants 方法的区分度较低的行为。)

    【讨论】:

    • 我希望我能接受这两个答案。这更符合我的要求,因为至少我让身后的人知道发生了什么事。
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2019-03-14
    • 2019-02-28
    • 2012-04-20
    • 2011-01-14
    • 1970-01-01
    • 2011-11-04
    • 2011-12-27
    相关资源
    最近更新 更多