Advertisement
rg443

JSONToXML.vbs

Sep 1st, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Const stateRoot = 0
  2. Const stateNameQuoted = 1
  3. Const stateNameFinished = 2
  4. Const stateValue = 3
  5. Const stateValueQuoted = 4
  6. Const stateValueQuotedEscaped = 5
  7. Const stateValueUnquoted = 6
  8. Const stateValueUnquotedEscaped = 7
  9.  
  10. Function JSONToXML(json)
  11.   Dim dom, xmlElem, i, ch, state, name, value
  12.   Set dom = CreateObject("Microsoft.XMLDOM")
  13.   state = stateRoot
  14.   For i = 1 to Len(json)
  15.     ch = Mid(json, i, 1)
  16.     Select Case state
  17.     Case stateRoot
  18.       Select Case ch
  19.       Case "["
  20.         If dom.documentElement is Nothing Then
  21.           Set xmlElem = dom.CreateElement("ARRAY")
  22.           Set dom.documentElement = xmlElem
  23.         Else
  24.           Set xmlElem = XMLCreateChild(xmlElem, "ARRAY")
  25.         End If
  26.       Case "{"
  27.         If dom.documentElement is Nothing Then
  28.           Set xmlElem = dom.CreateElement("OBJECT")
  29.           Set dom.documentElement = xmlElem
  30.         Else
  31.           Set xmlElem = XMLCreateChild(xmlElem, "OBJECT")
  32.         End If
  33.       Case """"
  34.         state = stateNameQuoted
  35.         name = ""
  36.       Case "}"
  37.         Set xmlElem = xmlElem.parentNode
  38.       Case "]"
  39.         Set xmlElem = xmlElem.parentNode
  40.       End Select
  41.     Case stateNameQuoted
  42.       Select Case ch
  43.       Case """"
  44.         state = stateNameFinished
  45.       Case Else
  46.         name = name + ch
  47.       End Select
  48.     Case stateNameFinished
  49.       Select Case ch
  50.       Case ":"
  51.         value = ""
  52.         State = stateValue
  53.       End Select
  54.     Case stateValue
  55.       Select Case ch
  56.       Case """"
  57.         State = stateValueQuoted
  58.       Case "{"
  59.         Set xmlElem = XMLCreateChild(xmlElem, "OBJECT")
  60.         State = stateRoot
  61.       Case "["
  62.         Set xmlElem = XMLCreateChild(xmlElem, "ARRAY")
  63.         State = stateRoot
  64.       Case " "
  65.       Case Chr(9)
  66.       Case vbCr
  67.       Case vbLF
  68.       Case Else
  69.         value = ch
  70.         State = stateValueUnquoted
  71.       End Select
  72.     Case stateValueQuoted
  73.       Select Case ch
  74.       Case """"
  75.         xmlElem.setAttribute name, value
  76.         state = stateRoot
  77.       Case "\"
  78.         state = stateValueQuotedEscaped
  79.       Case Else
  80.         value = value + ch
  81.       End Select
  82.     Case stateValueQuotedEscaped ' @@TODO: Handle escape sequences
  83.      value = value + ch
  84.       state = stateValueQuoted
  85.     Case stateValueUnquoted
  86.       Select Case ch
  87.       Case "}"
  88.         xmlElem.setAttribute name, value
  89.         Set xmlElem = xmlElem.parentNode
  90.         state = stateRoot
  91.       Case "]"
  92.         xmlElem.setAttribute name, value
  93.         Set xmlElem = xmlElem.parentNode
  94.         state = stateRoot
  95.       Case ","
  96.         xmlElem.setAttribute name, value
  97.         state = stateRoot
  98.       Case "\"
  99.          state = stateValueUnquotedEscaped
  100.       Case Else
  101.         value = value + ch
  102.       End Select
  103.     Case stateValueUnquotedEscaped ' @@TODO: Handle escape sequences
  104.      value = value + ch
  105.       state = stateValueUnquoted
  106.     End Select
  107.   Next
  108.   Set JSONToXML = dom
  109. End Function
  110.  
  111. Function XMLCreateChild(xmlParent, tagName)
  112.   Dim xmlChild
  113.   If xmlParent is Nothing Then
  114.     Set XMLCreateChild = Nothing
  115.     Exit Function
  116.   End If
  117.   If xmlParent.ownerDocument is Nothing Then
  118.     Set XMLCreateChild = Nothing
  119.     Exit Function
  120.   End If
  121.   Set xmlChild = xmlParent.ownerDocument.createElement(tagName)
  122.   xmlParent.appendChild xmlChild
  123.   Set XMLCreateChild = xmlChild
  124. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement