2014-11-13 19 views
1

UPDATE:閱讀的Xm​​lNodeList到使用DataSet VB.NET

我要動態地轉儲返回到數據集的XML,而無需編寫出來的列名。返回的數據格式非常簡單,列名,數據,然後關閉列名稱。像這樣:

<runsql> 
    <cst_id>0005675667</cst_id> 
    <ind_last_name>Abe</ind_last_name> 
    <ind_first_name>Adam</ind_first_name> 
    <cst_ixo_title_dn/> 
    <cst_org_name_dn>Acme University</cst_org_name_dn> 
    <cst_eml_address_dn>[email protected]</cst_eml_address_dn> 
</runsql> 

我一直在使用標準格式來訪問我們的Web服務並返回特定的字段。我需要修改它以將整個XML饋送轉儲到VB.NET中的內部數據集中。此Web服務是在我的Web參考部分中預定義的。我在下面的代碼中取得了成功,但經過多次Google搜索和測試之後,無法找到一種方法將所有列動態加載到數據集中。我可以使用以下格式獲取幫助以加載到數據集中嗎?

Dim proxy As New myWS.netFORUMXMLWebServices 
    Dim strInSQL As String 
    Dim strOutXML2 As XmlDocument 
    strOutXML2 = New XmlDocument 
    Dim oNode2 As XmlNode 
    Dim oResultsNode2 As XmlNode 

    strInSQL = "SELECT cst_eml_address_dn FROM WebServicesTable" 

    strOutXML2.LoadXml("<myResults></myResults>") 
    oResultsNode2 = proxy.runsql(strInSQL) 
    Dim xmlNewDoc As XmlDocument 
    xmlNewDoc = New XmlDocument 
    xmlNewDoc.LoadXml(oResultsNode2.OuterXml) 
    strOutXML2.DocumentElement.AppendChild(strOutXML2.ImportNode(xmlNewDoc.DocumentElement, True)) 
    Dim oResultsNodeList2 As XmlNodeList 
    oResultsNodeList2 = xmlNewDoc.SelectNodes("//runsql") 

    For Each oNode2 In oResultsNodeList2 

     returnedEmail = oNode2.SelectSingleNode("cst_eml_address_dn").InnerText 

    Next 

如果您想知道「runsql」是我們供應商給我們的Web服務末尾的參數。 (webservices.asmx?op = runsql)

+0

我們可以看到你搞亂結構......好像你拿刀砍,並且在重新從'proxy.runsql'回報這可以直接導入DS。 – Plutonix

+0

@Plutonix,當然。我編輯了帖子。直接導入DS完全是我想要的。上面的代碼顯示了我一直在使用的工具來檢索值。我不知道如何編輯我的工作代碼,直接將其轉儲到DS中,而無需指定列名稱等。 – trevoray

+0

@Plutonix對不起,第一次做賞金事情。我想通過將你的回答標記爲回答,你會自動獲得賞金。 – trevoray

回答

3

基本上,您只需要使用DataSet.ReadXML加載XMLDocument即可。下面是一個方法:

' build xmlDoc to stand in for [proxy.runsql] return 
Dim xdoc As New XmlDocument 

' xml literal for the data 
Dim x = <Document> 
      <Employee> 
       <Name>Ziggy Foobar</Name> 
       <HireDate>2/11/2010</HireDate> 
      </Employee> 

      <Elements> 
       <Name>Helium</Name> 
       <Symbol>He</Symbol> 
      </Elements> 

      <Employee> 
       <Name>Zoey Foobaz</Name> 
       <HireDate>2/11/2013</HireDate> 
      </Employee> 

      <runsql> 
       <cst_id>0005675667</cst_id> 
       <ind_last_name>Abe</ind_last_name> 
       <ind_first_name>Adam</ind_first_name> 
       <cst_ixo_title_dn/> 
       <cst_org_name_dn>Acme University</cst_org_name_dn> 
       <cst_eml_address_dn>[email protected]</cst_eml_address_dn> 
      </runsql> 
     </Document> 

' load litersl to XmlDocument 
xdoc.LoadXml(x.ToString)    

'***** xdoc is now a stand in for the return from [proxy.runsql] 

Dim ds As New DataSet 

' load xdoc to dataset via node reader 
Using xnr As New XmlNodeReader(xdoc) 
    ds.ReadXml(xnr)   ' this is what you want 
End Using      ' dispose of node reader 

Dim n As Integer        ' test/view DS result 
' verify: 2 tables? 
For Each t As DataTable In ds.Tables 
    Console.WriteLine("Table: " & t.TableName) 

    ' we know there are 2, just verifying 
    Console.WriteLine("Column Names: {0}, {1}", t.Columns(0).ColumnName, 
         t.Columns(1).ColumnName) 

    n = 1 
    For Each r As DataRow In t.Rows 
     ' demo there only 2 cols 
     Console.WriteLine("[Item {0}]: {1}, {2}", n.ToString, 
          r(0).ToString, r(1).ToString) 
     n += 1 
    Next 
    Console.WriteLine() 

Next 

最終的結果是在DS 3個表,用膠合到一起的非連續Employee數據。沒有必要指定表名或列名,它自己解析它們。在你的情況下,除了「runsql」之外,你可以忽略DataSet中的任何其他表。在測試代​​碼寫完後,我粘貼了你的runsql塊,所以一些「只有2列」的評論是錯誤的。輸出:

Table: Employee 
Column Names: Name, HireDate 
[Item 1]: Ziggy Foobar, 2/11/2010 
[Item 2]: Zoey Foobaz, 2/11/2013 

Table: Elements 
Column Names: Name, Symbol 
[Item 1]: Helium, He 

Table: runsql 
Column Names: cst_id, ind_last_name 
[Item 1]: 0005675667, Abe 

作品在我的機器TM

+0

Awsome!謝謝!因此,我只需要將2行代碼添加到我的預先存在的代碼中: Dim ds1 As New DataSet ds1.ReadXml(New XmlNodeReader(xmlNewDoc)) – trevoray

+0

稍微修復答案 - NodeReader支持'IDispose' ,所以完成後應該處理掉。有點難以分辨你想要的東西其實很簡單,或者我不瞭解。用於翻譯XML的代碼很難確定是否有數據被預先添加或刪除。很高興它對你有效! – Plutonix