2009-06-02 2 views
6

Предположим, я получаю следующую структуру XML:Как получить доступ к XML текстового узла в Jquery

<root> 
<item> 
<item1>text1</item1> 
<item2>text2</item2> 
more text here 
</item> 
</root> 

«больше текста здесь» является текстовым узлом, который находится на том же уровне, как и другие узлы данных в иерархии, но он, похоже, не доступен.

Есть ли способ извлечь текстовый узел, показанный выше, используя функции jQuery?

+0

Использование .html(), а не .text(), и вы получите исходное содержимое. –

+3

за исключением .html() не доступен для xml – safoo

ответ

6

Я пришел с тем же раствором:

var xml = $("<root><item1>text1</item1><item2>text2</item2>more text here</root>"); 
    alert($(xml).contents().empty().end().text()); 
4

Так что решение я придумал, чтобы удалить ITEM1 и ITEM2 узлы, оставляя только текст:

$(responseXML).find('item').each(function(){ 
     var item1_text = $(this).find('item1').text(); 
     var item2_text = $(this).find('item2').text(); 

     $(this).contents().empty(); //removes the other nodes 

     var extra_text = $(this).text(); 

    } 
4

использовать содержимое (). Например, если у вас есть фрагмент XML, как:

var root = $('<root><item1>text1</item1><item2>text2</item2>more text here</root>'); 

Тогда вы можете получить в тексте с помощью:

var txt = root.contents()[2] 

То есть в предположении, что текстовый узел всегда третий ребенок < корня > , В противном случае, если вы не знаете, положение, или может иметь узел, который содержит несколько текстовых узлов, вы должны собрать все текстовые узлы с помощью фильтрации:

var textList = root.contents().filter(function() { return this.nodeType == 3; }); 

Это возвращает массив текстовых узлов, которые находятся в фрагмент XML. Чтобы перейти к строкам в списке, просто войдите в срез массива:

var txt = textList[0]; 
+0

Пробовал ли вы код перед публикацией? Ни один из приведенных вами примеров не работает. –

+0

Да, я просто проверил, разрезая и вставляя в jquery 1.3.2. Поскольку это все переменные назначения, firebug ничего не печатает, если вы просто вырезаете и вставляете - вам нужно повторить его или просто опустить настройку. – johnvey

+0

+1 для неразрушающего решения. – Niklas

0

Это даст правильное значение корня/текста. Текст можно разместить везде в корневом узле.

<script type="text/javascript"> $().ready(function() { var xml = $('#xml').find('root').contents().each(function(i){ if (this.nodeName=="#text" && this.nodeType=="3" && this.nodeValue.length>2) alert(this.nodeValue); }); });
</script>

для:

<div id="xml"><root><item1>text1</item1><item2>text2</item2>more text here</root></div> 

Примечания: "встроенный" XML не работает в Internet Explorer, но если заменить корень и itemX в примере с действующим nodenames Html, он будет работать слишком.

DOM рассматривает пустые и текстовые узлы как элементы. при отладке выше .each(), вы увидите следующее:

alert(this.nodeName + '|' + this.nodeType + "|" + this.nodeValue); 

#text|3| , ITEM1|1|null , #text|3| , ITEM2|1|null , #text|3| more text here 

(К сожалению, форматирование не работает с венгерской клавиатурой, до сих пор)

Смежные вопросы