Показать сообщение отдельно
  #11 (permalink)  
Старый 21.06.2019, 09:11
Новичок на форуме
Отправить личное сообщение для Tachyon Посмотреть профиль Найти все сообщения от Tachyon
 
Регистрация: 19.06.2019
Сообщений: 8

Сообщение от Malleys Посмотреть сообщение
Почему бы не использовать XML?
Потому что приходится работать с тем, что генерирует драйвер устройства. Программиста, написавшего драйвер, по ряду причин достать и заставить переписать STDOUT на XML или JSON намного сложнее.

Сообщение от Alexandroppolus Посмотреть сообщение
Немного пофиксил, на этот раз вроде всё как надо
Спасибо, на такой вариант, с парсингом параметров непосредственно при поиске тегов, несколько затрудняет последующую обработку нестандартных параметров (которые без =значение). Сейчас у меня получается делать это последовательно.

Конкретный пример:
<value name='name<">1' value="value1">
<value name='name2' value = "еще <одно> значение">
<block name="name3" property="tagret" clear>
   "текст"
   Этот тег не обрабатывается и остается в тексте:
   <левый тег парсить="не нужно">
   А вот этот тег нужно вырезать из содержимого
   и обработать с другими аналогичными:
   <value name='name3' clear value="value3">
</block>
<text name="text1" property="target">
   а это незакрытый тег, содержимое берется до следующего
   такого же или до конца. Левый тег остается в тексте.
   <левый тег парсить="не нужно">
<text clear name="text2" property="target">
   второй текстовый блок, читается до конца.
   <block name="inner block" property="tagret">
      А этот текстовый блок тоже вырезается из содержимого
      и парсится отдельно.
   </block>


Получается как-то так. Не сомневаюсь, что решение далеко от оптимального, но вроде бы работает. По крайней мере пока, с теми примерами вывода, которые я смог получить.
var string = xmlHttp.responseText.replace(/[\r\n]/g, '');
var value = new Array(), block = new Array(), text = new Array();

string = string.replace(/<\s*value(\s+(?:"[^"]*"|'[^']*'|[^>"'])*)?>/gi, function(a,b) {
   var obj = PropParse(b);
   value.push(obj);
   return '';
});

var reg = /<\s*block(\s+(?:"[^"]*"|'[^']*'|[^>"'])*)?>/i;
while (reg.test(string)) {
   var pos1 = string.match(reg);
   var pos2 = string.match(/<\s*\/\s*block\s*>/i);
   var obj = PropParse(pos1[1]);
   obj.innerValue = string.substring(pos1.index+pos1[0].length, pos2.index);
   string = string.substr(0, pos1.index) + string.substr(pos2.index+pos2[0].length);
   block.push(obj);
}

var res = string.split(/<\s*text\s+/i);
for (var i = 0; i < res.length; i++) {
   res[i].replace(/^\s*((?:"[^"]*"|'[^']*'|[^>"'])*)>(.*)$/, function(a,b,c) {
      var obj = PropParse(b);
      obj.innerValue = c;
      if (!obj.clear) obj.clear = false;
      text.push(obj);
   });
}

function PropParse(str) {
   var obj = new Object();
   var val = str.replace(/\s*([\w-]+)\s*[=:]\s*("[^"]*"|'[^']*'|[\w-]+)\s*/g, function(a,b,c) {
      obj[b.trim()] = c.trim().replace(/(^["']|["']$)/g, '');
      return '';
   });
   val = val.replace(/[^\s\w-]/, '');
   var left = val.split(/\s/);
   for (var i = 0; i < left.length; i++) {
      obj[left[i].trim()] = true;
   }
   return obj;
}
Ответить с цитированием