15 октября 2012 г.

Конвертация XML в JSON

Конвертация XML в JSON

Недавно столкнулся с проблемой преобразования ответа от сервера из XML в JSON. После продолжительного поиска в сети был найден замечательный скрипт от Stefan Goessner, который можно скачать по данному адресу: http://goessner.net/download/prj/jsonxml/. Там же присутствует и скрипт для обратной конвертации, а так же примеры как использовать данные скрипты.
Скрипт очень хорош, но при его использовании может возникнуть пара проблем о которых я и хочу рассказать в данном посте.
Функция конвертации имеет вид xml2json(xml, tab), где xml - строка  в xml, а tab - это символ которым необходимо разделять строки. Первый параметр как все понимают обязательный, а второй необязательный. Теперь когда мы вызываем функцию без второго параметра то получаем строку в JSON формате в начале которой стоит "undefined ". С чего бы это вдруг ? Оказывается что в ответе возвращается строка return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}"; . Теперь все ясно первый раз вставляется символ tab без проверки на наличие. Заменяем данную строку на следующую return "{\n" + (tab ? tab : "") + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}"; . Ну вот другое дело, теперь нам возвращается JSON без лишних неопределенных элементов.

Вторая проблема возникает когда скрипт пытается обработать xml-строку в которой имеется заголовок вида <?xml version="1.0" encoding="windows-1251"?> , скрипт его не отрабатывает, поэтому перед передачей строки скрипту необходимо удалить данный заголовок.

Еще одна проблема возникает когда мы пытаемся из полученной строки получить объект. При выполнении var jsonObj = JSON.parse(xml2json(xml,""));, где xml - это все та же строка в формате XML в ответ вместо желанного объекта мы получаем ошибку SyntaxError: Unexpected token ILLEGAL. На сей раз проблема кроется в символе переноса строки "\n" который стоит после первой и перед последней фигурными скобками.  Функция JSON.parse() не может обработать данную последовательность и поэтому завершается неудачно. Решение проблемы очень легкое просто удалить данные символы из вывода. return "{" + (tab ? tab : "") + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "}"; Теперь все должно заработать. Для тех кому лень разбираться я сделал форк данного скрипта и разместил его по адресу https://github.com/oiljin/xml2json так что качайте , пользуйтесь.

Пример использования:


Для начала напишите функцию которая создает DOMParser
function parseXml(xml) {
   var dom = null;
   if (window.DOMParser) {
      try { 
         dom = (new DOMParser()).parseFromString(xml, "text/xml"); 
      } 
      catch (e) { dom = null; }
   }
   else if (window.ActiveXObject) {
      try {
         dom = new ActiveXObject('Microsoft.XMLDOM');
         dom.async = false;
         if (!dom.loadXML(xml)) // parse error ..

            window.alert(dom.parseError.reason + dom.parseError.srcText);
      } 
      catch (e) { dom = null; }
   }
   else
      alert("cannot parse xml string!");
   return dom;
}
Затем используйте так:
var xml = '<e name="value">text</e>',
    dom = parseXml(xml),
    json = xml2json(dom);
var jsonObj = JSON.parse(json);


Комментариев нет:

Отправить комментарий