0

次のコードを書きました。

Imports System.Xml
Imports System.Security.Cryptography
Imports System.IO

Public Class FormMain

Private Sub btnGo_Click(sender As System.Object, e As System.EventArgs) Handles btnGo.Click
    Dim ds1 As New DataSet
    ds1 = NewGetRecords()
    DataGridView1.DataSource = ds1.Tables(0)
    Label1.Text = ds1.Tables(0).TableName
    If ds1.Tables.Count > 1 Then
        DataGridView2.DataSource = ds1.Tables(1)
        Label2.Text = ds1.Tables(1).TableName
    End If
End Sub
Public Function NewGetRecords() As DataSet
    Dim ds As New DataSet
    Dim xd As New XmlDocument
    xd.LoadXml(TextBox1.Text)
    ds.ReadXml(New XmlNodeReader(xd))
    Return ds
End Function

End Class

これが私が使用しているXMLデータです(そしてこれは機能します):

<?xml version="1.0"?><ABMDataSets><ABDataSet><OwnerLogin>demo</OwnerLogin><OwnerUniqueID>abcd</OwnerUniqueID><OwnerPassword>abcd</OwnerPassword><OwnerName>Demo Owner</OwnerName><Address1>324 East Wisconsin Avenue</Address1><Address2>Suite 423</Address2><Address3></Address3><City>Milwaukee</City><State>WI</State><Country>US</Country><PostalCode>53202</PostalCode><Phone>414-431-8775</Phone><Email>abcd@efg.com</Email><PayPalAccount>abcd@efg.com</PayPalAccount><PercentMarkup>5</PercentMarkup><JoinDate>2012-01-25 00:57:00</JoinDate><ReferredBy></ReferredBy><Active>1</Active></ABDataSet></ABMDataSets>

うまくいかないのは、複数のレコードがある場合です (たとえば、上記のようなレコードが 2 つある場合):

<?xml version="1.0"?><ABMDataSets><ABDataSet><OwnerLogin>demo</OwnerLogin><OwnerUniqueID>abcd</OwnerUniqueID><OwnerPassword>abcd</OwnerPassword><OwnerName>Demo Owner</OwnerName><Address1>324 East Wisconsin Avenue</Address1><Address2>Suite 423</Address2><Address3></Address3><City>Milwaukee</City><State>WI</State><Country>US</Country><PostalCode>53202</PostalCode><Phone>414-431-8775</Phone><Email>abcd@efg.com</Email><PayPalAccount>abcd@efg.com</PayPalAccount><PercentMarkup>5</PercentMarkup><JoinDate>2012-01-25 00:57:00</JoinDate><ReferredBy></ReferredBy><Active>1</Active><OwnerLogin>demo</OwnerLogin><OwnerUniqueID>abcd</OwnerUniqueID><OwnerPassword>abcd</OwnerPassword><OwnerName>Demo Owner</OwnerName><Address1>324 East Wisconsin Avenue</Address1><Address2>Suite 423</Address2><Address3></Address3><City>Milwaukee</City><State>WI</State><Country>US</Country><PostalCode>53202</PostalCode><Phone>414-431-8775</Phone><Email>abcd@efg.com</Email><PayPalAccount>abcd@efg.com</PayPalAccount><PercentMarkup>5</PercentMarkup><JoinDate>2012-01-25 00:57:00</JoinDate><ReferredBy></ReferredBy><Active>1</Active></ABDataSet></ABMDataSets>

最初のデータ セットから ABDataset という名前の素敵なテーブルが得られ、すべてのフィールドが期待どおりに列に含まれています。1 つのテーブルと 1 つのレコードしか得られません。2 番目のデータ セットでは、2 つのレコードで同じ結果が得られるはずですが、代わりに、フィールド名、列名、および値の間に識別可能な関係がない 19 または 20 のテーブルが得られます。

4

1 に答える 1

1

<rec></rec>ここで使用した、各レコードをカプセル化する追加のレベルが必要だと思います。

<?xml version="1.0" encoding="utf-8"?><ABMDataSets><ABDataSet><rec><OwnerLogin>demo</OwnerLogin><OwnerUniqueID>abcd</OwnerUniqueID><OwnerPassword>abcd</OwnerPassword><OwnerName>Demo Owner</OwnerName><Address1>324 East Wisconsin Avenue</Address1><Address2>Suite 423</Address2><Address3/><City>Milwaukee</City><State>WI</State><Country>US</Country><PostalCode>53202</PostalCode><Phone>414-431-8775</Phone><Email>abcd@efg.com</Email><PayPalAccount>abcd@efg.com</PayPalAccount><PercentMarkup>5</PercentMarkup><JoinDate>2012-01-25 00:57:00</JoinDate><ReferredBy/><Active>1</Active></rec><rec><OwnerLogin>demo</OwnerLogin><OwnerUniqueID>abcd</OwnerUniqueID><OwnerPassword>abcd</OwnerPassword><OwnerName>Demo Owner</OwnerName><Address1>324 East Wisconsin Avenue</Address1><Address2>Suite 423</Address2><Address3/><City>Milwaukee</City><State>WI</State><Country>US</Country><PostalCode>53202</PostalCode><Phone>414-431-8775</Phone><Email>abcd@efg.com</Email><PayPalAccount>abcd@efg.com</PayPalAccount><PercentMarkup>5</PercentMarkup><JoinDate>2012-01-25 00:57:00</JoinDate><ReferredBy/><Active>1</Active></rec></ABDataSet></ABMDataSets>

または、各レコードをラップします<ABDataSet></ABDataSet>

すべてのテーブルを一度に 1 つずつ表示するように、コードを少し変更しました。

            Dim miCnt As Integer

            Private Sub btnGo_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
                Dim ds1 As New DataSet
                ds1 = NewGetRecords()
                Dim iTbl As Integer = miCnt Mod ds1.Tables.Count
                DataGridView1.DataSource = ds1.Tables(iTbl)
                Label1.Text = ds1.Tables(iTbl).TableName
                miCnt += 1
            End Sub

NewGetRecords() コードをありがとうございます。

于 2013-04-03T20:15:39.210 に答える