1

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

<?xml version=”1.0” encoding=”UTF-8”&gt;
<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 阅读器来获取所有这些,但数据已经在数据集中,我想学习一些新东西。所以请只建议作为最后的手段。

提前致谢!

4

2 回答 2

1

第一点是您的 XML 格式不正确 - 快速复制并粘贴到 .NET 项目中的 xml 文档中会告诉您:<Response> </claimInquiryResponse>首先。

如果您可以解决这个问题:如果您使用 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
于 2011-01-06T17:00:02.567 回答
0

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

于 2011-03-03T20:18:57.790 回答