【问题标题】:XmlNode.InnerText breaks if data is null如果数据为空,则 XmlNode.InnerText 中断
【发布时间】:2017-12-22 16:38:54
【问题描述】:

我在 VS 2008 中有一个脚本任务。在这个脚本任务中,我得到一个数据集并将其转换为 XML,然后循环遍历节点:

Dim dsHistory As New DataSet
dsHistory = GetHistoryByYear(Year)


Dim HistoryDoc As New XmlDocument
HistoryDoc.LoadXml(dsHistory.GetXml)


Dim HistoryStudentList As XmlNodeList
Dim StudentNode as XmlNode
HistoryStudentList = HistoryDox.SelectNodes("/NewDataSet/Table")
dsHistory = Nothing


For Each HistoryStudentNode In HistoryStudentList

    Dim dsCurrentAssessment As New DataSet
    dsCurrentAssessment = GetCurrentAssessmentData(...)

    ...code to make sure dataset has data...

    Dim CurrentAssessmentDoc As New XmlDocument
    CurrentAssessmentDoc.LoadXml(dsCurrentAssessment.GetXml)
    Dim CurrentAssessmentNode As XmlNode
    CurrentAssessmentNode = CurrentAssessmentDoc.SelectSingleNode("/NewDataSet")


    For Each CurrentAssessment As XmlNode In CurrentAssessmentNode.SelectNodes("Table")

        InsertAssessmentHistory(HistInstanceID, CurrentAssessment.Item("TITLE").InnerText, CurrentAssessment.Item("CONTENT").InnerText, CurrentAssessment.Item("TYPE").InnerText, CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").InnerText)), CurrentAssessment.Item("REPORTING_METHOD").InnerText, CurrentAssessment.Item("SCORE_RESULTS").InnerText, CurrentAssessment.Item("INTERPRETATION").InnerText, CStr(htHistory("ASSESSMENT_ACTION")))

    Next
Next

我遇到的问题是 InsertAssessmentHistory 方法,特别是调用 CurrentAssessment.Item("SCORE_RESULTS").InnerText。数据集正在为其中一条记录返回空数据,看起来当在该记录上调用 .InnerText 时,由于 XML 标记“...”,它失败并显示“对象引用未设置为对象的实例”。

有没有办法调用.InnerText,如果没有数据则返回null?

【问题讨论】:

  • 是的。使用?.(例如CurrentAssessment.Item("SCORE_RESULTS")?.InnerText
  • @StevenDoggart 当我这样做时,智能感知状态“'System.XML.XMLElement' 类型的值不能转换为字符串”
  • 哦。抱歉,我没注意到这是 2008 年的 SSIS。 ?. 运算符是在 2015 年添加的。因此,如果您不能这样做,那么您将不得不更详细地进行操作(例如 null-coalescing If,或常规 If/Else 块,或三元If/IIf,或为您封装它的自定义方法)。
  • If(CurrentAssessment.Item("SCORE_RESULTS") Is Nothing, Nothing, IF(CurrentAssessment.Item("SCORE_RESULTS").InnerText Is Nothing, Nothing, CurrentAssessment.Item("SCORE_RESULTS").InnerText))
  • @DForck42 你有 2 个可行的解决方案,为什么不接受其中一个?

标签: sql-server vb.net ssis etl ssis-2008


【解决方案1】:

在@codexer 的指导下,我能够让它工作。内部循环现在看起来像这样:

For Each CurrentAssessment As XmlNode In CurrentAssessmentNode.SelectNodes("Table")

    Dim ScoreResults As String
    Dim Interpretation As String


    If CurrentAssessment.Item("SCORE_RESULTS") Is Nothing Then
        ScoreResults = Nothing
    Else
        If CurrentAssessment.Item("SCORE_RESULTS").InnerText Is Nothing Then
            ScoreResults = Nothing
        Else
            ScoreResults = CurrentAssessment.Item("SCORE_RESULTS").InnerText
        End If
    End If


    If CurrentAssessment.Item("INTERPRETATION") Is Nothing Then
        Interpretation = Nothing
    Else
        If CurrentAssessment.Item("INTERPRETATION").InnerText Is Nothing Then
            Interpretation = Nothing
        Else
            Interpretation = CurrentAssessment.Item("INTERPRETATION").InnerText
        End If
    End If



    InsertAssessmentHistory(HistInstanceID, _
        CurrentAssessment.Item("TITLE").InnerText, _
        CurrentAssessment.Item("CONTENT").InnerText, _
        CurrentAssessment.Item("TYPE").InnerText, _
        CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").InnerText)), _
        CurrentAssessment.Item("REPORTING_METHOD").InnerText, _
        ScoreResults, _
        Interpretation, _
        CStr(htHistory("ASSESSMENT_ACTION")))
Next

【讨论】:

  • 欢迎您,乐于助人。抱歉,它看起来一团糟,但它是一个单行解决方案,有时不是最漂亮的......
  • @DForck42 你必须接受这个答案,即使它是你的。所以问题被标记为已回答。
  • @Hadi 我将保持原样,看看是否有人提出了更优雅的解决方案。
  • 为什么要将数据集转换为 xml?为什么不使用数据集而不转换它?
  • @Hadi 不确定,但我认为这与将其作为 xml 导出到平面文件有关。我最初并没有写这个,而是维护它
【解决方案2】:

为什么要转换为 Xml,而您可以使用数据集来实现。 这是您作为答案提供的内部循环的数据集版本:

For Each CurrentAssessment As DataRow In dsCurrentAssessment.Tables(0).Rows

    Dim ScoreResults As String
    Dim Interpretation As String


    If CurrentAssessment.Item("SCORE_RESULTS") Is Nothing OrElse _
        String.IsNullOrEmpty(CurrentAssessment.Item("SCORE_RESULTS").ToString) Then
        ScoreResults = Nothing
    Else
        ScoreResults = CurrentAssessment.Item("SCORE_RESULTS").ToString
    End If


    If CurrentAssessment.Item("INTERPRETATION") Is Nothing OrElse _
        String.IsNullOrEmpty(CurrentAssessment.Item("INTERPRETATION").ToString) Then
        Interpretation = Nothing
    Else
        Interpretation = CurrentAssessment.Item("INTERPRETATION").ToString
    End If


    InsertAssessmentHistory(HistInstanceID, _
        CurrentAssessment.Item("TITLE").ToString, _
        CurrentAssessment.Item("CONTENT").ToString, _
        CurrentAssessment.Item("TYPE").ToString, _
        CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").ToString)), _
        CurrentAssessment.Item("REPORTING_METHOD").ToString, _
        ScoreResults, _
        Interpretation, _
        CStr(htHistory("ASSESSMENT_ACTION")))
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多