Java и xpath - проблема синтаксического анализа xHtml - PullRequest
0 голосов
/ 30 июля 2009

Я пытаюсь разобрать правильно сформированный документ 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 divs

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 пуст. Вы знаете, что не так с моим кодом?
Спасибо

Ответы [ 2 ]

2 голосов
/ 30 июля 2009

Проблема вашего второго сбойного XPath в том, что вы запускаете его с /:

/div/table//tr

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

div/table//tr

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

0 голосов
/ 30 июля 2009

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

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