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