XML для набора данных - проблема с поиском того, что dataow содержит - PullRequest
1 голос
/ 07 декабря 2010

Извините, если описание плохое, но я не знаю, как еще это выразить ... Но вот пример структуры 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. но я не могу понять, как связать его с тем, с кем он был связан. Индексы, сгенерированные отношениями, основаны на их происхождении (например, коды ошибок для Сьюзен будут 0, а для Питера - 1), не относящиеся к их расположению в XML.

Я либо делаю это неправильно, либо смотрю на эти данные неправильно. Я знаю, что могу использовать XML-ридер, чтобы получить все это, но данные уже находятся в наборе данных, и мне хочется узнать что-то новое. так что предложите это только в крайнем случае, пожалуйста.

спасибо заранее!

Ответы [ 2 ]

1 голос
/ 06 января 2011

Во-первых, ваш XML плохо сформирован - быстрое копирование и вставка в документ XML в вашем .NET-проекте покажет вам: <Response> </claimInquiryResponse> для начала.

Если выможет разобраться с этим потом: если вы выполняете операцию ReadXml с ReadMode.Auto, то вы сможете сделать следующее.Обратите внимание, что в .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 

Лучший способ сделать это, вероятно, выполнить цикл по информационной таблице и затем использовать представление данных.для фильтрации кодов ошибок и таблицы кодов ошибок, чтобы найти интересующие вас коды:

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
0 голосов
/ 03 марта 2011

В итоге я просто прочитал XML, проверил имя узла и создал отдельную таблицу для кодов ошибок, и когда я нашел конечный элемент для информации, я выплюнул таблицы по отдельности.

...