解析XML方法两则

类别:.NET开发 点击:0 评论:0 推荐:

(一)TransferXML函数
   Public Function TransferXMl(ByVal rawdata As String) As Hashtable
        Dim xmlDoc As New XmlDocument
        Dim clientPrescriptionNodes As XmlNodeList
        Dim clientPrescriptionNode As XmlNode
        Dim bodymark As Boolean = False
        Dim TempHashtable As New Hashtable
        Dim valuestr As String
        Dim v() As String
        xmlDoc.LoadXml(rawdata)
        clientPrescriptionNodes = xmlDoc.GetElementsByTagName("webmethod")  
         //webmethod指从哪个标记开始读取childnode到哈希表中
        For Each clientPrescriptionNode In clientPrescriptionNodes
            Dim baseDataNodes As XmlNodeList
            Dim baseDataNode As XmlNode
            Dim bFirstInRow As Boolean

            baseDataNodes = clientPrescriptionNode.ChildNodes
            bFirstInRow = True
            For Each baseDataNode In baseDataNodes
                If (bFirstInRow) Then
                    bFirstInRow = False
                Else
                    Console.Out.Write(",")
                End If
                If baseDataNode.Name = "body" Then              //此处body指内层再次嵌套的标记
                    bodymark = True
                    Console.Out.Write(baseDataNode.Name & ":" & "参数")
                    TempHashtable.Add("body", "1")
                Else
                    Console.Out.Write(baseDataNode.Name & ":" & baseDataNode.OuterXml.ToString)
                    valuestr = baseDataNode.OuterXml.ToString
                    valuestr = Replace(valuestr, Chr(34), "$")
                    v = valuestr.Split("$")
                    valuestr = v(1)
                    TempHashtable.Add(baseDataNode.Name, valuestr)
                End If
            Next
            Console.Out.WriteLine()
        Next
        If bodymark = True Then
            clientPrescriptionNodes = xmlDoc.GetElementsByTagName("body")
            For Each clientPrescriptionNode In clientPrescriptionNodes
                Dim baseDataNodes1 As XmlNodeList
                Dim baseDataNode1 As XmlNode
                Dim bFirstInRow1 As Boolean

                baseDataNodes1 = clientPrescriptionNode.ChildNodes
                bFirstInRow1 = True
                For Each baseDataNode1 In baseDataNodes1
                    If (bFirstInRow1) Then
                        bFirstInRow1 = False
                    Else
                        Console.Out.Write(",")
                    End If
                    Console.Out.Write(baseDataNode1.Name & ":" & baseDataNode1.InnerText)
                    TempHashtable.Add(baseDataNode1.Name, baseDataNode1.InnerText)
                Next
                Console.Out.WriteLine()
            Next
        End If
        TransferXMl = TempHashtable
        Exit Function
    End Function

(二)GetReqResult函数 
       Public Function GetReqResult(ByVal scontent As String) As Hashtable
        Dim snode As String  '节点名称
        Dim svalue As String '单个节点值
        Dim mvalue As String = "" '多个节点值
        Dim reqResult As New Hashtable 'Http请求内容列表

        Dim strReader As StringReader = New StringReader(scontent)
        Dim reader As XmlTextReader = New XmlTextReader(strReader)
        While (reader.Read())
            snode = reader.Name
            Select Case snode
                Case "action_id"       //每个case表示一个标记符
                    reader.Read()
                    svalue = reader.Value
                    reqResult.Add(snode, svalue)
                    reader.Read()
                Case "service_id"
                    reader.Read()
                    svalue = reader.Value
                    reqResult.Add(snode, svalue)
                    reader.Read()
                Case "mid"
                    reader.Read()
                    svalue = reader.Value
                    reqResult.Add(snode, svalue)
                    reader.Read()
                Case "mobile_id"
                    reader.Read()
                    svalue = reader.Value
                    reqResult.Add(snode, svalue)
                    reader.Read()
                Case "access_mode"  //当access_mode有连续两个时,用这种方法进行对接
                    reader.Read()
                    If mvalue = "" Then
                        mvalue = reader.Value
                    Else
                        mvalue = mvalue + "|" + reader.Value
                    End If
                    reader.Read()
            End Select
        End While
        If mvalue <> "" Then
            reqResult.Add("access_mode", mvalue)
        End If
        GetReqResult = reqResult
    End Function

-----------------------
(三)两个函数被调用时的方法
        Dim coll As NameValueCollection
        Dim sParam As String
        Dim reqbyte As Byte()  'Http请求字节流
        Dim Result As Hashtable 'Http请求内容列表
        coll = Request.Headers
        Dim ResStr As String = ""
        Dim Resbyte As Byte()
        Dim c(19) As String
        reqbyte = Request.BinaryRead(Request.ContentLength)
        sParam = System.Text.Encoding.ASCII.GetString(reqbyte)
        If sParam <> "" Then
            GetReqResult(sParam)
            If TransferXMl(sParam, Result) Then
                c(0) = lastvalue
                c(1) = Result.Item("Version")
                c(2) = Result.Item("MsgType")
                ........
                c(19) = Result.Item("FeatureStr")
  ResStr = ResStr + "<?xml version=" + Chr(34) + "1.0" + Chr(34) + "  ?>"
  ResStr = ResStr + "<......></......>"
  Resbyte = System.Text.Encoding.ASCII.GetBytes(ResStr)
  Response.BinaryWrite(Resbyte)
-------------------------------------
(四)将XML存入SQL SERVER数据库
 Private Sub saveOrderData(ByVal c() As String)
        Dim myConnection As New SqlConnection
        Dim mySelectQuery As String
        Dim myCommand As SqlCommand
        Dim brandstr As String


        Try

            myConnection = New SqlConnection("user id=sa ; password=; initial catalog=GOGO ; data source = 127.0.0.1")
            myConnection.Open()
            mySelectQuery = "insert into SyncOrderRelationReq(TransactionID,Version,MsgType,DeviceType,DeviceID,DeviceType1,DeviceID1,UserIDType,MSISDN,PseudoCode,UserIDType1,MSISDN1,PseudoCode1,LinkID,ActionID,ActionReasonID,SPID,SPServiceID,AccessMode,FeatureStr) values(" & c(0) & ",'" & c(1) & "','" & c(2) & "','" & c(3) & "','" & c(4) & "','" & c(5) & "','" & c(6) & "','" & c(7) & "','" & c(8) & "',CONVERT(binary,'" & c(9) & "'),'" & c(10) & "','" & c(11) & "',CONVERT(binary,'" & c(12) & "'),'" & c(13) & "','" & c(14) & "','" & c(15) & "','" & c(16) & "','" & c(17) & "','" & c(18) & "',CONVERT(binary,'" & c(19) & "')) "
            myCommand = New SqlCommand(mySelectQuery, myConnection)
            myCommand.ExecuteNonQuery()
        Catch
        End Try
    End Sub

本文地址:http://com.8s8s.com/it/it42996.htm