Как, с помощью JavaScript, я могу читать содержимое Childnode в XML-файле, который содержит HTML-теги - PullRequest
1 голос
/ 31 декабря 2010

Для чтения содержимого дочернего узла я использую:

MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("PageContent")[0].childNodes[0].nodeValue;

иногда, когда данные childNode содержат тег HTML (например, теги <b> или <br>), у меня возникают проблемы, поскольку они подсчитываются какXML-теги (например, дочерние узлы).

Мой вопрос заключается в том, как получить все данные из дочернего узла, даже если он содержит другие HTML-теги

Пример:

<MenuItem> 
    <MenuText>menu <b> text <b><MenuText>
</MenuItem >

вернул бы «меню», но я хочу, чтобы он вернулся: menu <b> text <b>

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Да, и нет, в зависимости от вашего парсера. Причина этого в том, что предполагается, что все текстовые узлы в XML заменены на <и> их htmlentity() аналогами, а все другие специальные символы заменены на htmlspecialchars(). Я вполне уверен, что он создает новый узел с тегом HTML в качестве имени.

Единственные два решения для этого - сохранить данные XML в строку, использовать регулярное выражение, чтобы извлечь теги HTML (ну, все символы <и> в этом отношении) и заменить их правильными значениями, которые я отметил выше, прежде чем передать его парсеру (parser.parseFromString() в javascript, учитывая, что 'parser' является парсером DOM). Другой заключается в том, чтобы взять узел, а затем получить набор дочерних узлов всего узла, используя рекурсивный цикл, а затем объединить их имена и содержимое. Второй метод - это больше программирования и больше обработки, и я предлагаю простое исправление регулярных выражений и замену символов.

Или, вы можете прочитать о CDATA здесь и вместо этого использовать теги, поместив весь контент в тег ![CDATA[], но это если вы создаете этот XML-файл. Вам следует уведомить веб-мастера сайта, с которого вы получили XML, о том, что XML создан неправильно, и теги необходимо экранировать с помощью тега ![CDATA[] или заменить <и> их аналогами htmlentity(). Я полагаю, что вы также можете использовать регулярные выражения, чтобы поместить HTML-код в тег ![CDATA[], но это, вероятно, медленнее и менее эффективно, чем замена тегов <и>.

0 голосов
/ 31 декабря 2010

Официальное свойство элемента W3C для возврата всего текста из элемента и всех его потомков является частью DOM v3 и называется textContent , но пока не поддерживается во всех браузерах (я смотрю на вас, IE ; Я думаю, что это называется innerText там) - если это даже актуально для вас.

Итак, ваша строка кода будет выглядеть примерно так для вашего фрагмента XML:

MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("MenuText")[0].textContent;

Это не сохранит теги HTML. Таким образом, в конечном итоге это зависит от того, что вы пытаетесь сделать с этим XML. Вы хотите добавить его в другое дерево DOM? Если это так, вы можете просто взять этот элемент со всеми его потомками и добавить его в другом месте.

MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("MenuText")[0].cloneNode(true);
someOtherElement.appendChild(MYDATA);

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

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