Как получить доступ к текстовому узлу XML в Jquery - PullRequest
6 голосов
/ 02 июня 2009

Предположим, я получил следующую структуру XML:

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

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

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

Ответы [ 4 ]

6 голосов
/ 02 июня 2009

Я придумал такое же решение:

  var xml = $("<root><item1>text1</item1><item2>text2</item2>more text here</root>");
  alert($(xml).contents().empty().end().text());
4 голосов
/ 02 июня 2009

Используйте функцию содержимого (). Например, если у вас есть фрагмент 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];
4 голосов
/ 02 июня 2009

Поэтому я решил удалить узлы 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();

    }
0 голосов
/ 02 июня 2009

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

<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); }); });<br> </script>

для:

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

Примечание: «встроенный» xml не работает в Internet Explorer, но если в примере заменить root и itemX действительными именами 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...