[英]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.