2013-06-22 5 views
0

Использование Ajax для извлечения данных XML. вопрос о пустых текстовых узлахтестирование, если у вас есть пустой текстовый узел в xml

Я прочитал этот вопрос/ответ здесь Javascript/XML - Getting the node name

и это помогло моему пониманию тонны о том, как устанавливаются структура вверх, однако у меня есть еще два вопроса .. когда он говорит об этом часть:

«Текст узел с возвратом каретки и некоторыми пробелами или вкладкой»

Как бы вы проверить, чтобы увидеть е вы получили пустой текстовый узел, как это? Я попытался тестирование, чтобы увидеть:

if nodeValue == null 
nodeValue == "null" 
nodeValue == "" 
nodeValue == " " 

ни один из них не представляется, работает

Я подумал, может быть длиной будет 0, так я проверил на .length и возвращается 5 (1 обратного ключ и 4 вкладки .. добавила вкладку дополнительную туда и испытанная снова вернулись 6)

Я тогда гугл, как удалить пробела и использовать эти:

.replace(/\s+/g, ' '); 
.replace(/^\s+|\s+$/g, ''); 

ни работал и до сих пор говорит, что .LEN gth был все еще 5

Причина, по которой я хочу проверить это, потому что, если я не знаю каждого из имен узлов узла перед рукой или точно, как DOM настроен.

Или есть лучший способ навигации, не утруждая себя проверкой, является ли текстовый узел только ключом tabs/spaces/return?

+0

'if (! NodeValue.trim(). Length)' должно быть достаточно – Xotic750

+0

@ Xotic750: До недавнего времени не было 'trim' на' String.prototype', поэтому полагаться на него может быть проблематичным. Есть ли у IE8 это? (У меня нет тестовой машины ...) –

+0

'if (! NodeValue.replace (/ (\ r \ n | \ n | \ r | \ s | \ t)/gm," "). Length)' – adeneo

ответ

2

.replace(/^\s+|\s+$/g, ''); работает, если пробелы/вкладки не являются пробелами и вкладками, но являются одним из различных других символов в Юникоде. Поэтому я предполагаю, что вы не совсем правильно использовали его.

Это было бы, как использовать его:

if (!textNode.nodeValue.replace(/^\s+|\s+$/g, '')) { 
    // Node is empty 
} 

Пример: Live Copy | Live Source

var xml = parseXml("<test>\n\t\t\t</test>"); 
var textNode = xml.documentElement.firstChild; 
display("textNode.nodeValue.length = " + 
     textNode.nodeValue.length); 
display('Is "empty"? ' + 
     (!textNode.nodeValue.replace(/^\s+|\s+$/g, ''))); 

function display(msg) { 
    var p = document.createElement('p'); 
    p.innerHTML = String(msg); 
    document.body.appendChild(p); 
} 

Выход:

textNode.nodeValue.length = 4 
Is "empty"? true

(где parseXML является from this answer.)


Но мы на самом деле не нужно делать replace (хотя накладные расходы на ведение это тривиально). Тест, как это будет делать:

if (/^\s*$/.test(textNode.nodeValue)) { 
    // The node is "empty" 
} 

Это регулярное выражение (ноль или более пробельных символов с якорями на обоих концах) будет соответствовать только строке, которая уже пусты или состоит только из пробельных символов.

+0

@TJ спасибо. Я использовал это неправильно. Я сделал это так же, как и вы, а затем изменил его, чтобы попробовать в моем коде .. работал оба раза. Где я могу узнать, что означают все разные символы в функции? s и g и т. д. и т. д. – Solus

+0

@ Солус: Не беспокойтесь, рад, что помог. :-) –

+0

Действительно. Это было больше смысла, чем окончательное решение. Я удалю его (так что он не используется в качестве решения), поскольку вы обновили :) +1 – Xotic750