Google-Apps-Script Convert XML в JSON - PullRequest
0 голосов
/ 16 марта 2020

У меня есть строка XML, например:

'<ALEXA VER="0.9" URL="davidwalsh.name/" HOME="0" AID="="><SD TITLE="A" FLAGS="" HOST="davidwalsh.name"><TITLE TEXT="David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else"/><LINKSIN NUM="1102"/><SPEED TEXT="1421" PCT="51"/></SD><SD><POPULARITY URL="davidwalsh.name/" TEXT="7131"/><REACH RANK="5952"/><RANK DELTA="-1648"/></SD></ALEXA>'

Я хочу преобразовать ее в JSON формат:

  {
    "ALEXA":{
       "@attributes":{
          "VER":"0.9",
          "URL":"davidwalsh.name/",
          "HOME":"0",
          "AID":"="
       },
       "SD":[
          {
             "@attributes":{
                "TITLE":"A",
                "FLAGS":"",
                "HOST":"davidwalsh.name"
             },
             "TITLE":{
                "@attributes":{
                   "TEXT":"David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else"
                }
...

Я нашел множество решений для , но ни одно из них не работало в . Я также видел этот вопрос: Парсинг XML в скрипте Служб Google , но это не совсем мой случай: я хотел бы проанализировать любой XML в JSON, а не только предоставленный образец. Я нашел собственное решение (в ответе) и не уверен, что оно соответствует всем случаям.

1 Ответ

2 голосов
/ 16 марта 2020

Я думал, что решение должно быть функцией рекурсии. После некоторых исследований я нашел этот замечательный код Дэвида Уолла sh и смог его принять. Вот к чему я пришел:

// Changes XML to JSON
// Original code: https://davidwalsh.name/convert-xml-json
function xmlToJson_(xml) {

  // Create the return object
  var obj = {};

  // get type
  var type = '';
  try { type = xml.getType(); } catch(e){}

  if (type == 'ELEMENT') {
    // do attributes
    var attributes = xml.getAttributes();
    if (attributes.length > 0) {
      obj["@attributes"] = {};
      for (var j = 0; j < attributes.length; j++) {
        var attribute = attributes[j];
        obj["@attributes"][attribute.getName()] = attribute.getValue();
      }
    }
  } else if (type == 'TEXT') {
    obj = xml.getValue();
  }

  // get children
  var elements = [];
  try { elements = xml.getAllContent(); } catch(e){}


  // do children
  if (elements.length > 0) {
    for(var i = 0; i < elements.length; i++) {
      var item = elements[i];

      var nodeName = false;
      try { nodeName = item.getName(); } catch(e){}

      if (nodeName)
      {
        if (typeof(obj[nodeName]) == "undefined") {
          obj[nodeName] = xmlToJson_(item);
        } else {
          if (typeof(obj[nodeName].push) == "undefined") {
            var old = obj[nodeName];
            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xmlToJson_(item));
        }                
      }
    }
  }
  return obj;
};

Я разместил образец на GitHub .

Использование:

  var xml = XmlService.parse(xmltext); 
  Logger.log(JSON.stringify(xmlToJson_(xml)));

Ссылка :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...