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 テーブル内のデータの実際の値が得られます。しかし、それが関連付けられていた行/人にリンクする方法がわかりません。リレーションシップが生成するインデックスは、XML 内の位置に関連するのではなく、その発生に基づいて構築されます (たとえば、スーザンのエラー コードは 0、ピーターのエラー コードは 1 になります)。

私はこれを間違っているか、このデータを間違って見ています。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 

これを行うためのより良い方法は、おそらく情報テーブルをループしてから、データビューを使用して 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 を読み通すだけで終わり、info の end 要素を見つけたときに、テーブルを個別に吐き出しました。

于 2011-03-03T20:18:57.790 に答える