2009-07-29 2 views
0

Я пытаюсь проанализировать хорошо сформированный документ xhtml.
У меня возникают проблемы во время итераций узлов.
Мои Xhtml имеет структуру, какJava и xpath - проблема синтаксического анализа 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, содержащий список других объектов, созданные из каждой строки в таблице

Так я сначала извлечь нодлист из этого 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 пуст. Вы знаете, что не так с моим кодом?
Thank you

ответ

2

Проблема в вашем втором неисправного XPath является то, что вы начинаете его с /:

/div/table//tr 

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

div/table//tr 

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

+0

Ты прав Павел! Я думал, что (как второй параметр) я передавал «контекст» методу оценки(). Я думаю, что я пробовал без/до публикации здесь, но, возможно, я изменил еще кое-что еще, и это не сработало в то время. В любом случае, теперь он работает. Большое спасибо за вашу помощь! – mickthompson

+0

Вы передаете здесь контекст. Проблема заключается в том, что, используя ведущий '/' в запросе, вы говорите ему, чтобы он запускал путь не из контекстного узла, а из _root_ документа, к которому принадлежит узел. –

0

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

+0

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

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