2014-11-06 2 views
0

Во-первых, мой ввод не очень хорошо сформирован XML. Так что в основном у меня есть куча тегов. Как я могу использовать javascript/Regex для извлечения всех значений между тегом <message>?Извлечь все значения между тегами

Вход:

<bad xml doc> 
<a>dsda</a> 
<message>hi</message> 
<b></b> 
<c>dsds</c> 
<message>get this message too</message> 

Выход:

привет
получить это сообщение слишком

+0

Где делает откуда взялся XML? –

+3

Документ * malformated * никогда не может быть правильно разобран. Не пытайтесь исправить симптомы. Исправьте причину! – dognose

+0

Это сообщения об ошибках, которые объединены в одну длинную строку, поэтому он содержит много сообщений xml вместе с текстом. Я просто пытаюсь рассматривать его как текстовый ввод и использовать js/regex для получения всех значений между тегами – gishman

ответ

0

Вы можете использовать match с глобальным флагом:

var messages = text.match(/<message>(.*?)<\/message>/g).map(function (m) { 
    return m.slice(9, -10); 
}) 
console.log(messages.join('\r\n')); 

var text = '<bad xml doc>\ 
 
<a>dsda</a>\ 
 
<message>hi</message>\ 
 
<b></b>\ 
 
<c>dsds</c>\ 
 
<message>get this message too</message>'; 
 

 
var messages = text.match(/<message>(.*?)<\/message>/g).map(function (m) { 
 
    return m.slice(9, -10); 
 
}); 
 

 
window.alert(messages.join('\r\n'));

+0

это только возвращает первое сообщение. Могу ли я конкатенировать сообщения с помощью \ r \ n? – gishman

+0

@ gishman Да. Просто присоедините массив сообщений с нужным разделителем, например '\ r \ n'. – dreyescat

+0

Спасибо, дрейескат – gishman

0
var re = /<message>(.*)<\/message>/gm; 
var str = '<bad xml doc>\n <a>dsda</a>\n <message>hi</message>\n<b></b>\n <c>dsds</c>\n<message>get this too</message>'; 
var m; 

while ((m = re.exec(str)) != null) { 
    if (m.index === re.lastIndex) { 
     re.lastIndex++; 
    } 
    // View your result using the m-variable. 
    // eg m[0] etc. 
} 
+0

Похоже, что это может сработать. Нужны ли одинарные кавычки вокруг первой строки следующим образом: var re = '/ (. *) <\/message>/gm'; – gishman

+0

Нет, вам не нужны одинарные кавычки для 1-й строки. Посмотрите на эту страницу: http://codepen.io/anon/pen/hjsFo – Rdey

+0

Добро пожаловать ... если это решило вашу проблему, то, пожалуйста, отметьте проблему как решенную. С уважением Rdey – Rdey

0

JQuery является на самом деле очень хорошо для разбора и пересекающее XML, а также HTML. Стратегия будет заключаться в создании объекта jQuery с вашим плохим XML, а затем вы можете использовать селекторы CSS для запроса.

Например, чтобы предупредить текст внутри 1-го сообщения:

var badDoc = $('<bad xml doc><a>dsda</a><message>hi</message><b></b><c>dsds</c><message>get this too</message>'); 
alert(badDoc.find('message')[0].innerHTML);