2013-05-14 3 views
0

Я пытаюсь сделать некоторые синтаксический и я застрял ... Вот структура HTML:Синтаксический HTML с Jsoup

<ul class="sub-menu"> 
<li id="1" class="1"><a href="http://link">SOME TEXT</a> 
    <ul class="sub-menu"> 
     <li .... ><a ... /></li> 
     <li .... ><a ... /></li> 
     <li .... ><a ... /></li> 
    </ul> 
</li> 
<li id="2" class="2"><a href="http://link2">SOME OTHER TEXT</a> 
    <ul class="sub-menu"> 
     <li .... ><a ... /></li> 
     <li .... ><a ... /></li> 
     <li .... ><a ... /></li> 
    </ul> 
</li></ul> 

Мне нужно, чтобы каждый Li (ID = 1, 2 и s), а затем lis внутри них (<li .... ><a ... /></li>).

Вот как мой Java выглядит:

// ul contains the source above 
Elements lis = ul.select("li"); // I know that this line screws up everything here, but I can't figure out how to do it correctly 
for(Element li: lis) 
{ 
    String text = li.select("a").first().text(); 
    Elements lis2 = li.select("ul[class=sub-menu]").first().getElementsByTag("li");  
    for(Element li2: lis2) 
    { 
     Element a = li2.select("a").first(); 
     // and other stuff with 'a' 
    } 
} 

Так может кто-нибудь помочь мне решить эту проблему?

EDIT: Проблема заключается в том, что ul.select("li"); возвращает каждый «li» в источнике, который я написал здесь. Мне нужно получить lis с id 1, 2 и так далее. И тогда мне нужно получить те <li .... ><a ... /></li>. P.S. Извините за мой плохой английский.

+1

Где моя проблема? – nikmin

+0

Я обновил свой вопрос. –

ответ

0

Я не уверен, но попробовать что-то вроде этого

for(Element element : doc.select("[li]")) 
{ 
    if(element.attr("id")== 1 || element.attr("id").getValue()== 2) 
    { 
     // thats your elements 'element' 
     System.out.println(element); 
    } 
} 

С уважением, Hugo Педроса

+0

Нет, это решение для меня не подходит. Идентификаторы могут быть изменены в любое время, и их количество превышает 2 лиза. Но, с другой стороны, это будет хорошо, как временное решение, пока я не выясню что-то еще. –

0

Вы пробовали

`ul.children()` 

Я думаю, что он будет возвращать только немедленным детские узлы ul.

0

Используйте методы сравнения, построенные в JSoup, такие как <,> и т.д.

Вы можете выбрать элементы, включив селектор псевдо, который будет смотреть на относительное положение в структуре DOM относительно его родителя:

Elements lis = ul.select("li:lt(2)");

, который должен привести только возвращая Ли 0 и 1.

Пожалуйста, обратитесь к документации JSoup для псевдо селекторов, которая объясняет это лучше чем я могу!

http://jsoup.org/cookbook/extracting-data/selector-syntax

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