Java и xpath - проблема парсинга xHtml

Я пытаюсь разобрать правильно сформированный документ xhtml.
У меня проблемы во время итерации узлов.
Мой xHtml имеет такую ​​структуру, как

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head>...</head>
  <body>
   ...
    <form>
    ...
      <div class="AB">    (1 or 2 times)
      ...                       
        <div class="CD">  
        ...
          <table>          
             <tbody>
                <tr>    (1 to N times)
                   <td> XXX </td>
                       <td> YYY </td> ...

Нужная мне информация содержится в столбцах (td).
Я хочу построить N объектов. Таким образом, каждая строка (tr) содержит в своих столбцах информацию, необходимую для создания объекта.
У меня 1 или 2 div класса = "AB". Итак, в основном у меня будет 1 или 2 объекта AB, содержащих список других объектов, созданных из каждой строки в таблице

Итак, сначала я извлекаю NodeList этих AB div.

NodeList ABlist= (NodeList) xpath.evaluate("//div[@class='AB']", document, XPathConstants.NODESET)

Теперь я пытаюсь получить NodeList всех элементов первого div AB.

NodeList trList = (NodeList) xpath.evaluate("/div/table//tr", ABlist.item(0), XPathConstants.NODESET);

В этом случае trList пуст. Вы знаете, что не так с моим кодом?
Спасибо


person mickthompson    schedule 29.07.2009    source источник


Ответы (2)


Проблема во втором неудачном XPath заключается в том, что вы начинаете его с /:

/div/table//tr

В XPath, как и в путях к файлам, начало пути с / означает «начинать с корня документа». Но на самом деле вы не хотите этого делать - вы хотите начать с вашего узла. Так:

div/table//tr

буду делать то, что ты хочешь.

person Pavel Minaev    schedule 29.07.2009
comment
Ты прав, Павел! Я думал, что (как второй параметр) я передаю «контекст» методу eval (). Я думаю, что я пробовал без / до публикации здесь, но, возможно, я тем временем изменил что-то еще, и это не сработало в то время. Во всяком случае, сейчас он работает. Спасибо большое за вашу помощь! - person mickthompson; 30.07.2009
comment
Вы передаете контекст. Проблема в том, что, используя ведущий / в запросе, вы указываете ему начинать путь не с узла контекста, а с корня документа, которому этот узел принадлежит. - person Pavel Minaev; 30.07.2009

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

person skaffman    schedule 29.07.2009
comment
Привет, скаффман, я правильно извлекаю ABlist div. Это только способ, которым я пытаюсь извлечь trList, который не работает. На самом деле вы правы, в документе не указывается какое-либо пространство имен, поэтому, возможно, его можно назвать только xml. Он соответствует только спецификации xml без указания какого-либо пространства имен. - person mickthompson; 30.07.2009