dom4j XPath не работает при разборе документа xhtml - PullRequest
1 голос
/ 02 сентября 2010

Я пытаюсь использовать dom4j для разбора документа xhtml. Если я просто распечатываю документ, я вижу весь документ, и я знаю, что он загружается правильно. Два элемента div, которые я пытаюсь выбрать, находятся на одном уровне в документе.

html
  body
    div
     table
      tbody
       tr
        td
         table
           tbody
            tr
             td
              div class="definition"
              div class="example"

Мой код

List<Element> list = document.selectNodes("//html/body/div/table/tbody/tr/td/table/tbody/tr/td");

но список пуст, когда я делаю System.out.println(list);

Если я только сделаю List<Element> list = document.selectNodes("//html");, он на самом деле возвращает список с одним элементом в нем. Поэтому я не понимаю, что случилось с моим xpath и почему он не находит эти div

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010

Попробуйте объявить пространство имен xhtml в xpath, например, свяжите его с префиксом x и используйте //x:html/x:body... в качестве выражения XPath (см. также эту статью , которая, однако, предназначена для Groovy, а не для простой Java). Вероятно, что-то вроде следующего должно сделать это в Java:

DefaultXPath xpath = new DefaultXPath("//x:html/x:body/...");
Map<String,String> namespaces = new TreeMap<String,String>();
namespaces.put("x","http://www.w3.org/1999/xhtml");
xpath.setNamespaceURIs(namespaces);

list = xpath.selectNodes(document);

(непроверенные)

1 голос
/ 27 июня 2013

Альтернативой может быть: -

//div[@class='definition' or @class='example']

При этом выполняется поиск элементов "div" в любом месте документа со значениями атрибутов "class", равными "Definition" или "example".

Я считаю, что этот подход более четко иллюстрирует то, что вы пытаетесь получить со страницы. Дополнительным преимуществом является то, что если структура страницы меняется, но классы div остаются прежними, ваш xpath обновлять не нужно.

Вы также можете проверить свою работу xpath в отношении документа HTML, используя следующий плагин Firefox, который очень полезен.

Плагин Firefox - XPath Checker 0.4.4

1 голос
/ 02 сентября 2010

А как насчет "// div"?Или "// html / body / div / table / tbody"?Я обнаружил, что длинные буквальные выражения XPath трудно отлаживать, так как моим глазам легко обмануться ... поэтому я разбиваю их до тех пор, пока они НЕ ДЕЙСТВУЮТ, а затем снова создаю.

...