【问题标题】:Reading xmlNodeList into a Dataset using VB.NET使用 VB.NET 将 xmlNodeList 读入数据集
【发布时间】:2015-01-10 22:51:56
【问题描述】:

更新:

我想将返回的 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>Adam@acmeu.edu</cst_eml_address_dn>
</runsql>

我一直在使用标准格式来访问我们的网络服务并返回特定字段。我需要修改它以将整个 XML 提要转储到 VB.NET 中的内部数据集中。这个 Web 服务是在我的 Web References 部分中预定义的。我在下面的代码中取得了成功,但在经过大量谷歌搜索和测试之后,无法找到将所有列动态加载到数据集中的方法。我可以使用下面的这种格式加载到数据集中获得帮助吗?

    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)

【问题讨论】:

  • 我们能看到你正在搞乱的结构吗...看起来你正在切碎并重新打包来自proxy.runsql 的返回,它可以直接导入到 DS 中。
  • @Plutonix,当然。我编辑了帖子。直接导入 DS 正是我想要的。上面的代码显示了我一直在使用的用于检索值的方法。我不知道如何编辑我的工作代码以将其直接转储到 DS 中而无需指定列名等。
  • @Plutonix 对不起,第一次做赏金。我认为通过将您的回复标记为已回答,您将自动获得赏金。
  • 谢谢!我确实看到这是您的第一次,这就是为什么我在为时已晚之前提到它的原因。

标签: asp.net xml vb.net web-services


【解决方案1】:

基本上,您只需要使用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>Adam@acmeu.edu</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 数据重新粘合在一起。无需指定表名或列名,它会自行解析它们。在您的情况下,您可以忽略DataSet 中除“runsql”之外的任何其他表。我在编写测试代码后粘贴了你的 runsql 块,所以一些“只有 2 列”的 cmets 是错误的。输出:

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

【讨论】:

  • 太棒了!谢谢!所以,我只需要在我预先存在的代码中添加 2 行代码: Dim ds1 As New DataSet ds1.ReadXml(New XmlNodeReader(xmlNewDoc))
  • 对答案的轻微修复 - NodeReader 支持IDispose,所以应该在完成后处理它。很难说你想要的是真的简单还是我不理解。翻录 XML 的代码使得很难知道是否事先添加或删除了数据。很高兴它对你有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2020-12-08
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多