【问题标题】:XML to dataset - problem finding what datarow contains a datatableXML 到数据集 - 查找包含数据表的数据行的问题
【发布时间】:2010-12-07 13:40:04
【问题描述】:

对不起,如果描述很差,但我不知道该怎么说...... 但这里有一个 XML 结构的例子

<?xml version=”1.0” encoding=”UTF-8”>
<Response xmlns="http://www.blah.com">
  <searchResult>
    <info>
      <firstName>John</firstName>
      <lastName>Doe</lastName>
      <totalCharges>100.00</totalCharges>
      <nonPaymentCode>99999</nonPaymentCode>
    </info>
    <info>
      <firstName>Susan</firstName>
      <lastName>Doe</lastName>
      <totalCharges>1000.00</totalCharges>
      <errorCodes>
        <errorCode>12345</errorCode>
      </errorCodes>
    </info>
    <info>
      <firstName>Peter</firstName>
      <lastName>Doe</lastName>
      <totalCharges>10.00</totalCharges>
      <errorCodes>
        <errorCode>12345</errorCode>
        <errorCode>54321</errorCode>
        <errorCode>85246</errorCode>
      </errorCodes>
    </info>
  </searchResult>
</claimInquiryResponse>

我已将其转换为数据集,以便将信息作为数据表访问。 但我的问题是试图获取错误代码。我试图通过检查表的关系来解决这个问题。因为我必须弄清楚哪些错误代码与什么人相关联,才能正确显示它们。我无法控制 XML 结构,为了减少多余的带宽,一切都是可选的,因此此时更改它不是一个选项。但这里是我所做的一个例子:

For Each rel As DataRelation In ds.Tables(i).ChildRelations
    If rel.Nested Then
        Dim temp As New DataTable
        temp = rel.ChildTable
        For Each relationship As DataRelation In temp.ChildRelations
            For Each row As DataRow In relationship.ChildTable.Rows
                For Each column As DataColumn In relationship.ChildTable.Columns
                    rowValues &= column.ColumnName & "-" & row(column.ColumnName) & "-" & relationship.RelationName & vbCrLf
                Next
            Next
        Next
    End If
Next

这为我提供了 errorCodes 表中数据的实际值。但我不知道如何将它链接回与之关联的行/人。关系生成的索引是根据它们的出现构建的(例如,susan 的错误代码将为 0,peter 的错误代码为 1),与它们在 XML 中的位置无关。

我要么做错了,要么不正确地查看了这些数据。 我知道我可以使用 XML 阅读器来获取所有这些,但数据已经在数据集中,我想学习一些新东西。所以请只建议作为最后的手段。

提前致谢!

【问题讨论】:

    标签: .net xml vb.net dataset relationships


    【解决方案1】:

    第一点是您的 XML 格式不正确 - 快速复制并粘贴到 .NET 项目中的 xml 文档中会显示:&lt;Response&gt; &lt;/claimInquiryResponse&gt; 开始。

    如果您可以解决这个问题:如果您使用 ReadMode.Auto 执行 ReadXml 操作,那么您应该能够执行以下操作。请注意,.NET 添加了额外的列来维护关系,我现在已经对这些进行了硬编码:

    Dim strfile As String = "somefile.xml"
            Dim ds As New DataSet
            ds.ReadXml(strfile, XmlReadMode.Auto)
    
        For Each drInfo As DataRow In ds.Tables("info").Rows
            Debug.Print(drInfo.Item("lastname").ToString + " " + drInfo.Item("firstname").ToString)
            For Each drCodes As DataRow In ds.Tables("errorCodes").Rows
                If drCodes.Item("info_Id").ToString = drInfo.Item("info_Id").ToString Then
                    For Each drCodeDetail As DataRow In ds.Tables("errorCode").Rows
                        If drCodeDetail.Item("errorCodes_Id").ToString = drCodes.Item("errorCodes_Id").ToString Then
                            Debug.Print(" Code ->" + drCodeDetail.Item("errorCode_Text").ToString)
                        End If
                    Next
                End If
            Next
        Next 
    

    更好的方法可能是遍历 info 表,然后使用数据视图过滤 errorCodes 和 errorCode 表以找到您感兴趣的代码:

    Dim dvCodes As New DataView, dvCodeDetail As New DataView
            dvCodes = ds.Tables("errorCodes").DefaultView
            dvCodeDetail = ds.Tables("errorCode").DefaultView
    
        For Each drInfo As DataRow In ds.Tables("info").Rows
            Debug.Print(drInfo.Item("lastname").ToString + " " + drInfo.Item("firstname").ToString)
            dvCodes.RowFilter = "info_Id = " + drInfo.Item("info_Id").ToString
            For i As Integer = 0 To dvCodes.Count - 1
                dvCodeDetail.RowFilter = "errorCodes_Id = " + dvCodes(i).Item(0).ToString
                For j As Integer = 0 To dvCodeDetail.Count - 1
                    Debug.Print(" Code ->" + dvCodeDetail(j).Item(0).ToString)
                Next
            Next
        Next
    

    【讨论】:

    • 无效的 xml 是在制作原始帖子时出现的复制/粘贴错误。它结构良好。
    【解决方案2】:

    我最终只是通读了 XML 检查节点名称并为错误代码构建了一个单独的表,当我找到信息的结束元素时,我分别吐出了这些表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2013-04-25
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多