2013-11-27 2 views
0

Вот ссылка http://www.w3schools.com/xpath/xpath_examples.aspВопросы о XPath учебник даваемые W3School

Так нажал на первый попробовать себя, вы увидите фрагмент кода. И я не знаю, что эта часть означает

while (result) 
{ 
    document.write(result.childNodes[0].nodeValue); 
    document.write("<br>"); 
    result=nodes.iterateNext(); 
} 

результат должен быть наименее значимый узел там и не должно хава не ChildNodes. И согласно стандарту W3C, первый узел следует обозначить как узел [1]. Поэтому я начал думать, что атомное значение является узлом, а затем внесло некоторые изменения в код.

Я изменил выражение XPATH и время цикла

path="/bookstore/book"; 
    ... 
    // original codes 
    ... 
    while (result) 
    { 
     document.write(result.childNodes[1].childNodes[0].nodeValue); 
     document.write("<br>"); 
     result=nodes.iterateNext(); 
    } 
    /* result 
    Everyday Italian 
    Harry Potter 
    XQuery Kick Start 
    Learning XML 
    */ 

Кажется, он хорошо работает. Затем другая модификация:

path="/bookstore/book"; 
    ... 
    // original codes 
    ... 
    while (result) 
    { 
     // the only change is here  ** 
     document.write(result.childNodes[2].childNodes[0].nodeValue); 
     document.write("<br>"); 
     result=nodes.iterateNext(); 
    } 
    /* result 
    blank 
    */ 

Кажется странным сейчас, я ожидал список авторов, но то, что у меня здесь, пусто. Потом еще крошечное изменение:

 document.write(result.childNodes[3].childNodes[0].nodeValue); 
/* result 
    Giada De Laurentiis 
    J K. Rowling 
    James McGovern 
    Erik T. Ray 
*/ 

childNode [1] обозначает Fisrt childNode книги - название, а childNode [3] обозначается второй - автор? Тогда я убедился, что childNode [2] должен быть атомным значением title. Но когда я попытался отобразить его с помощью childNode [2] и не удалось, я не буду показывать вам больше кодов - здесь уже загружается код. Итак, может ли кто-нибудь объяснить это мне?

И еще один вопрос:

см ссылку здесь http://www.w3schools.com/xpath/xpath_axes.asp

Он представил осей XPath и Расположение Path Expression, но нет ни одного примера дается в коде. Я не могу себе представить, как его использовать, может ли кто-нибудь привести какие-то примеры и просветить меня? (Я в основном использую java)

+5

Для записи w3schools полон неправильной информации, я рекомендую оставаться на своем сайте во время обучения. – djechlin

+1

Это похоже на JavaScript, который не совпадает с Java. – yshavit

+0

@yshavit Я знаю, что это javaScript, я имел в виду, что я надеюсь, что кто-то может решить мой второй вопрос, используя java. – bijiDango

ответ

1

Вы вводите в заблуждение модель DOM и модель XPath. В модели DOM узел имеет свойство childNodes, где индекс начинается с 0 и где childNodes содержит все виды узлов (узлы элементов, текстовые узлы, узлы узлов CDATA, узлы комментариев, узлы обработки команд). Модель данных XPath отличается, и ее выражения пути отличаются от дочерних узлов DOM. Позиционные предикаты в XPath начинаются с 1, а не с 0. В вашем примере используется XPath для адресации book элементов в дереве DOM, а затем изменения в адресных дочерних узлах с использованием DOM API. Это часто делается в среде браузера, поскольку браузеры реализуют W3C DOM, но иногда предлагают выбор XPath над деревом DOM.

И вы должны понимать, что в обоих DOM и модели XPath с <foo>bar</foo> есть foo элемент узел с дочерним узлом, текстового узла с содержимым bar. Примеры, которые вы видите, используют XPath для выбора узла элемента, а затем иногда используют коллекцию childNodes для адресации дочернего узла текста и для извлечения его свойства DOM nodeValue. По крайней мере, для ветвей Mozilla, Opera, Chrome, которые не нужны, вместо foo.childNodes[0].nodeValue вы можете просто получить доступ к foo.textContent. Но все это DOM, а не XPath.

Дерево для

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

может иметь узел с book элемент, который имеет 9 дочерних узлов, первый (с индексом 0 в коллекции DOM childNodes, с индексом 1 в XPath ./child::node()) является текстовым узлом с пробел, второй - элемент title, третий - текстовый узел с пробелом, четвертый (с индексом DOM 3), являющийся элементом author.

Конечно с XPath, если вы знаете, что вы заинтересованы только в узлах элементов вы не выбрали бы node()[4], вместо этого вы выбрали бы *[2] для второго элемента ребенка или просто author для дочернего узла автора элемента.

+0

Я еще не начал работу с моделью DOM, но почему 'result.childNodes [2] .childNodes [0] .nodeValue)' не дает мне авторов, пока 'result.childNodes [3] .childNodes [0]. nodeValue) 'do? – bijiDango

+0

Могу ли я предположить, что объединение xpath и DOM вместе должно быть эффективным способом анализа XML? – bijiDango

+0

В зависимости от анализатора XML-документ с белым пространством отступов между узлами элемента может иметь текстовые узлы в коллекции 'childNodes' между узлами элемента. Это может привести к разным индексам для узлов элементов, чем ожидаются некоторые люди. –

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