【问题标题】:Accessing values using LINQ to XML使用 LINQ to XML 访问值
【发布时间】:2014-06-08 00:55:31
【问题描述】:

我正在研究由另一个应用程序自动生成的 XML 格式,我想使用 Linq to XML 遍历 XML,但我不知道如何获取我需要的值。

这是 XML 的 sn-p:

<dict>
<key>Major Version</key><integer>1</integer>    
<key>Tracks</key>
<dict>
    <key>3620</key>
    <dict>
        <key>Track ID</key><integer>3620</integer>
        <key>Name</key><string>Ran</string>
        <key>Age</key><integer>22</integer>         
    </dict>
    <key>3622</key>
    <dict>
        <key>Track ID</key><integer>3622</integer>
        <key>Name</key><string>Jardine</string>
        <key>Age</key><integer>24</integer>         
    </dict>

如您所见,dict 在内部重复,键和值由各个节点分隔。我需要获取dict 节点,其中它们的键age 大于一个值(或者基本上,我需要按dict 下的一个值进行过滤)

到目前为止,我将所有Age 值作为一个列表:

        var ran = x.Root.Elements("dict")
                    .Elements("dict")
                    .Elements("dict")
                    .Select(r =>
                        r.Descendants("key")
                        .Where(w => w.Value == "Age")
                        .Select(s => (XElement)
                            s.NextNode
                            )
                    ).ToList();

由于Key 的实际值存储为兄弟节点,因此我使用NextNode 访问那些。

但是,这就是问题所在。如何根据条件过滤变量ran中的XElements,比如大于某个值?

我尝试了ran.Anyran.Select,但我不确定要使用哪个 lambda 表达式。或者我应该在我原来的ran 查询中附加我的过滤器?

【问题讨论】:

  • 这是一种非常糟糕的 XML 格式。当两个值属于一起时,不应仅通过它们彼此相邻来表示。
  • 不幸的是,XML 格式仍然存在(因为它实际上来自 iTunes XML 库)并且无法更改。相反,我使用 XSL 文件将 XML 从其当前形式转换为可被 .NET 中的XElement 读取的更友好的 XML 格式。然后是一个简单的 Linq to XML 查询来过滤掉我需要的项目。如果有人需要,我在这里paraesthesia.com/archive/2004/06/14/… 获得了 XSL。它将 XML 转换为 HTML 格式,但我修改了 XSL,以便我的应用程序可以正确使用它。

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


【解决方案1】:

使用ElementsAfterSelf.First(),您可以继续下一个XElement。这段代码做了很多假设,即会有另一个 XElement,它将是整数元素,值将是一个 int。您需要确定您对其他系统始终以这种格式向您发送 XML 的信任程度,或者您是否需要编写一些防御性代码。

var age = 23;

var ran = xdoc.Root.Elements("dict")
              .Elements("dict")
              .Elements("dict")
              .Elements("key")
              .Where(x => (string) x == "Age" && (int) x.ElementsAfterSelf.First() > age)
              .Select(x=>x.Parent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多