【问题标题】:XML to LINQ ElementAtOrDefault(x).elements for non-existant indexXML to LINQ ElementAtOrDefault(x).elements 用于不存在的索引
【发布时间】:2014-08-12 17:33:30
【问题描述】:

在使用 elementAtOrDefault 方法后,我需要在哪里拉取元素时遇到问题。我很确定我正在尝试做的事情也可以通过其他方式实现,可能我只是不知道。但在 LINQ 查询下面我正在尝试

Dim extractDetails = From GradScoreRows In doc.Root.Descendants(ns + "gradeOr") _
        Select New RecordScoreDetails With _
        { _
        .Result = GradScoreRows .Descendants(ns + "score").Elements(ns + "results").Value, _
        .ResultComment = GradScoreRows .Descendants(ns + "score").Elements(ns + "resultComment").Value, _
        .ImpactedScore = GradScoreRows .Descendants(ns + "score").Elements(ns + "ImpactedScore").Value, _
        .SubjectACode = GradScoreRows .Descendants(ns + "factors").Descendants(ns + "factor").ElementAtOrDefault(0).Elements(ns + "code").Value, _
        .SubjectARank = GradScoreRows .Descendants(ns + "factors").Descendants(ns + "factor").ElementAtOrDefault(1).Elements(ns + "rank").Value, _
        }

我要查询的 XML sn-p 是:

<gradeOr>
    <score>
           <results>Passed</results>
           <resultsComment>some comment</resultsComment>
           <impactedScore>Something impacted Score</impactedScore>
           <factors>
              <factor>
                  <code>A</code>
                  <rank>20</rank>
               </factor>
              <factor>
                   <code>B</code>
                   <rank>20</rank>
              </factor>
           </factors>
    </score>
</gradeOr>

问题是因素部分可能不会出现在我收到的每个 XML 中。我将如何处理这种情况?

我尝试使用没有默认值的 ElementsAt(x),显然我遇到了索引是我们在某些情况下的范围的问题,当我使用默认值时,我遇到了对象引用未设置为对象实例的问题.

【问题讨论】:

    标签: xml vb.net linq linq-to-xml


    【解决方案1】:

    可能有更优雅的方式,但其中一种方式是这样的:

    Dim extractDetails =
        From grade In doc...<gradeOr> 
        Let subjA = (From subj In grade.<score>.<factors>.<factor>).FirstOrDefault()
        Select New With {
            .Result = grade.<score>.<results>.Value,
            .ResultComment = grade.<score>.<resultsComment>.Value,
            .ImpactedScore = grade.<score>.<impactedScore>.Value,
            .SubjectACode = If(subjA IsNot Nothing, subjA.<code>.Value, Nothing),
            .SubjectARank = If(subjA IsNot Nothing, subjA.<rank>.Value, Nothing)
        }
    

    这使用子查询来查找第一个&lt;factor&gt;(如果有),并检查在填充属性时是否找到了它。我对重复的If() 语句不太满意,但它似乎工作正常。

    您需要调整以适应您的类和/或命名空间,因为我没有这些信息。我也不完全确定这是否获得了 SubjectACode/Rank 属性的正确元素,因为我认为您的代码从不同的 &lt;factor&gt; 元素中提取它们,而且我不确定您的示例 XML 中的 A 值如何与SubjectA有关。如果我遗漏了什么,请澄清。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多