Как использовать XML DOM API для перехода на все нетекстовые узлы? - PullRequest
3 голосов
/ 06 апреля 2009

Я новичок в XML и DOM. Я думаю, мне нужно использовать DOM API, чтобы найти, пройти через все нетекстовые узлы один раз и вывести имя узла.

скажем, я получил этот пример XML от W3C

<bookstore>

<book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 <page pagenumber="550"/>
</book>

<book category="children">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
 <page pagenumber="500"/>
</book>
</bookstore>

Мне нужно найти такой узел, как <page pagenumber="500" />, который является нетекстовым узлом

Как я могу это сделать? Седуо-код тоже подойдет. Спасибо

Могу ли я сказать

 while (x.nodeValue == NULL) {
   read the next node ?
}

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

Ответы [ 4 ]

3 голосов
/ 06 апреля 2009

XPATH = "// * [not (text ())]"
Будут выбраны все узлы, которые не являются текстовыми узлами.
Вот в данном примере: bookstore и book также являются нетекстовыми узлами, поскольку у них нет собственного текста, хотя у их дочерних элементов есть текст.

2 голосов
/ 06 апреля 2009

Ваш вопрос в основном выглядит следующим образом: Учитывая документ XML, Как найти дочерние узлы, у которых нет текстового содержимого.

Простое выражение XPath, такое как:

/bookstore/book/*[count(child::text()) = 0]

или

/bookstore/book/*[not(text())]

сделает это за вас. Применение этого выражения XPath к образцу документа вернет набор узлов, содержащий оба элемента page. Вам не нужно заранее знать имя элемента страницы или даже имена всех возможных дочерних элементов элемента book, как вы можете видеть.

Для объяснения: Вам необходимо запросить дочерние узлы элемента книги, которые не содержат ЛЮБЫХ текстовых дочерних узлов. Ось child :: * представляет все дочерние узлы текущего узла, а тип узла text () ограничивает типы обработанных узлов теми, которые содержат текстовое содержимое.

Редактировать : обратите внимание, что если вы хотите запросить нетекстовые узлы в любом XML-документе (в соответствии с вашим последним редактированием вопроса), вы должны выбрать предоставленный ответ nils_gate . Мой ответ был дан до вашего редактирования и иллюстрирует концепцию, а не предоставляет общее решение.

1 голос
/ 06 апреля 2009

Похоже, вам понадобится XPath. Сайт W3 Schools имеет хорошую ссылку , но, предполагая, что узел всегда отображается под узлом, XPath /bookstore/book/page вернет набор узлов с каждым узлом в нем. /bookstore/book/page[@pagenumber='500'] получит каждый узел, у которого атрибут pagenumber имеет значение 500.

Синтаксис // найдет узел в любом месте документа, не беспокоясь о структуре - это может быть проще, но медленнее, особенно с большими документами. Если у вас есть документ с известной структурой, лучше всего использовать явный XPath.

1 голос
/ 06 апреля 2009

Что вы знаете об узле, который вам нужно найти? Если вы точно знаете, что это:

  • A page элемент
  • Имеет атрибут pagenumber со значением 500

тогда XPath - это путь вперед (при условии, что он доступен на вашей платформе - вы не указали ничего, кроме "DOM"; большинство реализаций DOM включают XPath, насколько я видел).

В этом случае вы использовали бы XPath:

//page[@pagenumber='500']

Если вы не можете использовать XPath, объясните, какой DOM API вы используете, и мы можем попытаться найти лучшее решение. В основном вы, вероятно, в конечном итоге будете выполнять итерации по каждому узлу элемента, проверяя, является ли его имя page, а затем проверяя, имеет ли он соответствующее значение атрибута pagenumber.

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