Сообщение от 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;
}