繁体   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