【问题标题】:Formatting XML Response VB.NET格式化 XML 响应 VB.NET
【发布时间】:2014-09-25 11:30:40
【问题描述】:

我有以下代码可用作下拉选择事件,

'calling ersal webservice for banks
Dim service As New IMPALA.IMPALA
Dim bank As String
bank = service.Remittance_Bank(username, password, pin, code, txtbenfadd.Text)
'MsgBox(bank)
'formating the xml responce
Dim formater As StringBuilder
formater = New StringBuilder()
formater.Append("<?xml version=""1.0"" encoding=""UTF-8""?><root>")
formater.Append(bank)

formater.Append(""" /></root>")
'MsgBox(formater.ToString)
Dim xmlDoc = XElement.Parse(formater.ToString)
Dim root As IEnumerable(Of XElement) = xmlDoc.Elements()
Dim names As StringBuilder
Dim names1 As StringBuilder
names = New StringBuilder
names1 = New StringBuilder
For Each row In root
    Dim attr As XAttribute
    Dim attr2 As XAttribute
    For Each attr In root.Attributes("BANK_CODE").AsEnumerable

        names.Append(attr.Value + "|")
    Next
    For Each attr2 In root.Attributes("BANK_NAME").AsEnumerable

        names1.Append(attr2.Value + "|")
    Next
Next
Dim strArr() As String
Dim strArr1() As String
strArr = names.ToString.Split("|")
strArr1 = names1.ToString.Split("|")
Dim itemsList As ArrayList
itemsList = New ArrayList()
itemsList.Add(strArr)
itemsList.Add(strArr1)
'MsgBox(names.ToString)
For count = 0 To strArr1.Length - 1
    ddlbank.Items.Add(strArr1(count))
    ddlbnkcode.Items.Add(strArr(count))
Next

我刚刚发现了一个错误,这取决于来自 Web 服务的 XML 响应类型。下面是一个示例响应

<row BANK_CODE="111" BANK_NAME="KENYAN BANK"/>
<row BANK_CODE="121" BANK_NAME="EAST BANK"/>
<row BANK_CODE="185" BANK_NAME="NAKUMATT BANK"/>
<row BANK_CODE="125" BANK_NAME="KENYAN CONSUMER BANK"/>
<row BANK_CODE="174

当响应如上时,代码有效 因为我已经将它附加到格式化程序但是当响应很好地关闭时,如下所示

<row BANK_CODE="111" BANK_NAME="KENYAN BANK"/>
<row BANK_CODE="121" BANK_NAME="EAST BANK"/>
<row BANK_CODE="185" BANK_NAME="NAKUMATT BANK"/>
<row BANK_CODE="125" BANK_NAME="KENYAN CONSUMER BANK"/>
<row BANK_CODE="174" BANK_NAME="TUSKYS BUYERS BANK">

我收到以下错误:

名称不能以 '"' 字符开头,十六进制值 0x22。第 1 行,位置 2078。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Xml.XmlException:名称不能以 '"' 字符开头,十六进制值 0x22。第 1 行,位置 2078。

来源错误:

第 83 行:formater.Append(""" />")
第 84 行:'MsgBox(formater.ToString)
第 85 行:Dim xmlDoc = XElement.Parse(formater.ToString)
第 86 行:Dim root As IEnumerable(Of XElement) = xmlDoc.Elements()
第 87 行:Dim 名称为 StringBuilder

请在我可以附加结束部分或捕获异常并继续之前检查 XML 响应的任何帮助。

【问题讨论】:

  • 所以你有一个函数Remittance_Bank,它返回一个无效的XML,在中间被裁剪,然后你通过添加缺少的双引号并关闭标签来完成这个XML。当函数返回有效的完整 XML 时,您的代码将失败。这应该反过来,您应该在不完整的 XML 上失败,删除添加双引号的代码,并修复 Remittance_Bank 以始终返回有效的 XML。

标签: xml vb.net


【解决方案1】:

嗨,GSerg,我无法控制 Web 服务返回的内容,因为我正在集成到其他人的系统中,我想出了一种通过编辑这样的代码来捕获一些错误的方法

 Dim formater As StringBuilder
        formater = New StringBuilder()
        formater.Append("<?xml version=""1.0"" encoding=""UTF-8""?><root>")
        formater.Append(bank)
        Dim xmlDoc As XElement

        If bank.EndsWith("/>") Then
            Try
                formater.Append("</root>")
                xmlDoc = XElement.Parse(formater.ToString)
            Catch
                MsgBox("INVALID XML")
            End Try
        ElseIf bank.EndsWith("<row ") Then
            Try
                formater.Append(" /></root>")
                xmlDoc = XElement.Parse(formater.ToString)
            Catch
                MsgBox("INVALID XML")
            End Try
        ElseIf bank.EndsWith("<row") Then
            Try
                formater.Append(" /></root>")
                xmlDoc = XElement.Parse(formater.ToString)
            Catch
                MsgBox("INVALID XML")
            End Try
        Else
            Try
                formater.Append(""" /></root>")
                xmlDoc = XElement.Parse(formater.ToString)
            Catch
                MsgBox("INVALID XML")
            End Try
        End If
       'just displaying the fromatted xml to see the end result for test purposes
        MsgBox(formater.ToString)

虽然当我得到代码时我的代码仍然会中断

<row BANK_CODE="111" BANK_NAME="KENYAN BANK"/>
<row BANK_CODE="121" BANK_NAME="EAST BANK"/>
<row BANK_CODE="185" BANK_NAME="NAKUMATT BANK"/>
<row BANK_CODE="125" BANK_NAME="KENYAN CONSUMER BANK"/>
<row BANK_CODE

例如 你知道我如何将银行名称作为下拉列表中的文本和代码作为值,因为它们显示在不同的下拉列表中,它们彼此不匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多