簡體   English   中英

對 VB.NET DataTable 的無組織 XML 響應

[英]Unorganized XML response to VB.NET DataTable

我正在從其他應用程序獲取 XML 響應,如最后所示。 它沒有適當的模式作為響應。 我對他們的反應沒有任何控制權。

我正在嘗試將此 XML 響應轉換為 VB.Net DataTable。 通常,一個記錄應包含 6 個節點(6 列)。

問題是:並非所有記錄都獲得 XML 響應中的所有 6 個節點。 有些記錄只有 5 個節點。

即:如果您看到下面的示例代碼,第一條和第三條記錄都有 6 個值。 但第二條記錄只有 5 個值,(第二條記錄中缺少)。

為了識別新記錄何時在 RAW xml 中開始,我為每個節點編寫了以下帶有循環的代碼,但是當缺少特定的第 6 個節點時,循環編號不匹配,並且值將發布到其他記錄中。

我該如何解決這個問題?

以下是我的 VB.Net 代碼。

Private Sub PullData(ByVal XMLData As String)
        Dim PullRequest As WebRequest
        Dim RequestXML As String = ""
        RequestXML = XMLData ' Called XML Function
        PullRequest = WebRequest.Create("http://localhost:9000")
        CType(PullRequest, HttpWebRequest).UserAgent = ".NET Framework Example Client"
        PullRequest.Method = "POST"
        Dim postData As String = RequestXML
        Dim byteArray() As Byte = Encoding.UTF8.GetBytes(postData)
        PullRequest.ContentType = "application/x-www-form-urlencoded"
        PullRequest.ContentLength = byteArray.Length
        Try
            Dim dataStream As Stream = PullRequest.GetRequestStream
            dataStream.Write(byteArray, 0, byteArray.Length)
            dataStream.Close()
            Dim response1 As WebResponse = PullRequest.GetResponse
            Dim Response As String = CType(response1, HttpWebResponse).StatusDescription.ToString
            dataStream = response1.GetResponseStream
            Dim reader As StreamReader = New StreamReader(dataStream)
            Dim responseFromServer As String = reader.ReadToEnd.ToString

            If responseFromServer <> "" And responseFromServer.ToString().Length > 23

Dim xmlDoc As XmlDocument = New XmlDocument()
                xmlDoc.LoadXml(responseFromServer)
                Dim xpath As String = "//ENVELOPE/DSPVCHDATE"
                Dim nodes = xmlDoc.SelectNodes(xpath)

                Dim Dt As New DataTable
                Dt.Columns.Clear()
                If Dt.Rows.Count > 0
                    Dt.Rows.Clear()
                End If
                Dt.Columns.Add("DSPVCHDATE")
                Dt.Columns.Add("DSPVCHLEDACCOUNT")
                Dt.Columns.Add("DSPVCHTYPE")
                Dt.Columns.Add("DSPVCHDRAMT")
                Dt.Columns.Add("DSPVCHCRAMT")
                Dt.Columns.Add("DSPEXPLVCHNUMBER")

                For Each childrenNode As XmlNode In nodes
                    For I As Integer = 0 To nodes.Count
                      
                        Dim NewDR As DataRow = Dt.NewRow
                        NewDR("DSPVCHDATE") = childrenNode.SelectNodes("//DSPVCHDATE").Item(I).InnerText
                        NewDR("DSPVCHLEDACCOUNT") = childrenNode.SelectNodes("//DSPVCHLEDACCOUNT").Item(I).InnerText
                        NewDR("DSPVCHTYPE") = childrenNode.SelectNodes("//DSPVCHTYPE").Item(I).InnerText
                        If childrenNode.SelectNodes("//DSPVCHDRAMT").Item(I).InnerText = ""
                            NewDR("DSPVCHDRAMT") = 0
                        Else
                            NewDR("DSPVCHDRAMT") = childrenNode.SelectNodes("//DSPVCHDRAMT").Item(I).InnerText
                        End If
                        If childrenNode.SelectNodes("//DSPVCHCRAMT").Item(I).InnerText = ""
                            NewDR("DSPVCHCRAMT") = 0
                        Else
                            NewDR("DSPVCHCRAMT") = childrenNode.SelectNodes("//DSPVCHCRAMT").Item(I).InnerText
                        End If
                       
                             If childrenNode.SelectNodes("//DSPEXPLVCHNUMBER").Item(I).Value isnot Nothing
                                If childrenNode.SelectNodes("//DSPEXPLVCHNUMBER").Item(I).InnerText.ToString() = ""
                                    NewDR("DSPEXPLVCHNUMBER") = ""
                                Else
                                    NewDR("DSPEXPLVCHNUMBER") = childrenNode.SelectNodes("//DSPEXPLVCHNUMBER").Item(I).InnerText.Replace("No. :", "").Replace("(", "").Replace(")", "")
                                End If
                            Else
                                NewDR("DSPEXPLVCHNUMBER") = ""
                            End If
                        End If

                        Dt.Rows.Add(NewDR)

                        If nodes.count = Dt.Rows.Count

以下是我的輸入 XML

    <ENVELOPE>
        <DSPVCHDATE>10-1-2020</DSPVCHDATE>
        <DSPVCHLEDACCOUNT>ABC LLC</DSPVCHLEDACCOUNT>
        <DSPVCHTYPE>Pymt</DSPVCHTYPE>
        <DSPVCHDRAMT></DSPVCHDRAMT>
        <DSPVCHCRAMT>263.00</DSPVCHCRAMT>
        <DSPEXPLVCHNUMBER>(No. :EV5235)</DSPEXPLVCHNUMBER>
    
        <DSPVCHDATE>10-1-2020</DSPVCHDATE>
        <DSPVCHLEDACCOUNT>Cash</DSPVCHLEDACCOUNT>
        <DSPVCHTYPE>Ctra</DSPVCHTYPE>
        <DSPVCHDRAMT>-2720.00</DSPVCHDRAMT>
        <DSPVCHCRAMT></DSPVCHCRAMT>

        <DSPVCHDATE>11-1-2020</DSPVCHDATE>
        <DSPVCHLEDACCOUNT>XYZ LLC</DSPVCHLEDACCOUNT>
        <DSPVCHTYPE>Rcpt</DSPVCHTYPE>
        <DSPVCHDRAMT>-230.00</DSPVCHDRAMT>
        <DSPVCHCRAMT></DSPVCHCRAMT>
        <DSPEXPLVCHNUMBER>(No. :RC6289)</DSPEXPLVCHNUMBER>
</ENVELOPE>

試試 linq

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)
        Dim envelope As XElement = doc.Descendants("ENVELOPE").FirstOrDefault()
        Dim dates As DateTime() = envelope.Descendants("DSPVCHDATE").Select(Function(x) CType(x, DateTime)).ToArray()
        Dim account As String() = envelope.Descendants("DSPVCHLEDACCOUNT").Select(Function(x) CType(x, String)).ToArray()
        Dim chType As String() = envelope.Descendants("DSPVCHTYPE").Select(Function(x) CType(x, String)).ToArray()
        Dim drAmt = envelope.Descendants("DSPVCHDRAMT").Select(Function(x) If(CType(x, String).Length = 0, vbNull, CType(x, Decimal))).ToArray()
        Dim crAmt = envelope.Descendants("DSPVCHCRAMT").Select(Function(x) If(CType(x, String).Length = 0, vbNull, CType(x, Decimal))).ToArray()
        Dim number As String() = envelope.Descendants("DSPEXPLVCHNUMBER").Select(Function(x) CType(x, String)).ToArray()


    End Sub

End Module

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM