2010-12-07 22 views
1

很抱歉,如果描述很差,但我不知道該怎麼把這個... 但這裏是XML結構的例子XML到數據集 - 問題找到什麼數據行包含一個DataTable

<?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閱讀器來獲取所有這些信息,但數據已經存在於數據集中,我覺得要學習新東西。所以只建議它作爲最後的手段請。

在此先感謝!

回答

0

我最終通過XML檢查節點名稱只是閱讀和建立一個單獨的表的錯誤代碼,當我發現結束信息元素我單獨吐出表格。

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 

一個更好的辦法來做到這一點可能是遍歷信息表,然後使用數據視圖過濾在ErrorCode的和的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 
+0

無效的xml是製作原始帖子時的複製/粘貼錯誤。它結構良好。 – John 2011-03-03 20:19:44