2013-07-30 1 views
1

У меня есть файл HTML, часть которого выглядит следующим образом:Как получить связанные классы и значения в JSoup?

<a name="user_createtime"></a> 
<p class="column"> 
<span class="coltitle">CreateTime</span>&nbsp;&nbsp;<span class="titleDesc"><span class='defPopupLink' onClick='popupDefinition(event, "datetime")'>datetime</span></span>&nbsp;&nbsp;&nbsp;&nbsp;<span class = "spaceandsize">(non-null)<sup><span class='glossaryLink' onclick="popupDefinition(event, '<b>non-null</b><br>The column cannot contain null values.')">?</span></sup></span> 
<br> 
<span class="desc">Timestamp when the object was created</span> 

<a name="user_createuser"></a> 
<p class="column"> 
<span class="coltitle">CreateUser</span>&nbsp;&nbsp;<span class="titleDesc">foreign key to <A HREF="User.html" TARGET="tableFrame">User</A></span>&nbsp;&nbsp;&nbsp;&nbsp; 
<span class = "spaceandsize">(database column: CreateUserID)</span> 
<br> 
<span class="desc">User who created the object</span> 

Есть много таких Coltitle. titleDesc и desc.

Теперь, если я получаю входную строку, как «CreateTime», я хочу выход быть:

CreateTime, datetime, Timestamp when the object was created 

и если я получаю строку ввода «CreateUser», я хочу выход быть:

CreateUser, foreign key to User, User who created the object 

Я использую Jsoup для этого, и я получил это далеко:

Elements colElements = Jsoup.parse(html).getElementsByClass("coltitle").select("*"); 


System.out.println("your Col:"); 
for (Element element : colElements) 
{ 
    if(element.ownText().equalsIgnoreCase("CreateTime")) 
     System.out.println(element.text()); 
} 

который просто выводит выбранный coltitl е. Как анализировать связанные классы и получать их значения? Или, они даже не связаны, и я просто иду по неправильному пути? Может ли кто-нибудь помочь мне получить мой желаемый результат?

ответ

1

Вы только выбирая <span> -tags, таким образом, только печать, что они ценности они занимают.

Вы можете использовать метод siblingElements(), чтобы получить братьев и сестер элемента, который вы выбрали первым.

Ваш HTML, кажется, не быть отформатирован правильно, но должно работать

System.out.println("your Col:"); 
for (Element element : colElements) { 
    if (element.ownText().equalsIgnoreCase("CreateTime")) { 
     System.out.print(element.text()); 
     for (Element sibling : element.siblingElements()) { 
      System.out.print(", " + sibling.text()); 
     } 
    } 
    if (element.ownText().equalsIgnoreCase("CreateUser")) { 
     System.out.print("\n"+element.text()); 
     for (Element sibling : element.siblingElements()) { 
      System.out.print(", " + sibling.text()); 
     } 
    } 
} 

Это будет выбирать элементы класса «colTitle». В случае if-case проверит, является ли это любой из них, а затем распечатайте текст элемента. Затем он перейдет к своим братьям и сестрам и распечатает их тексты.

+0

Ничего себе. Работает как шарм. Это из-за таких людей, как вы, что stackoverflow _IS ЧТО ЭТО. Хорошего дня! :-) – VictorCreator

+0

Спасибо! Всегда можно попытаться внести свой вклад в то, что можно! ;) –

0

Согласно документам api, вы можете вызвать children() в colElements.

http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#children()

+0

Элементы, которые он выбирает, не имеют детей, но являются узлами сестры. –

+0

Спасибо за ваш быстрый ответ. Но вы говорите, что ** titleDesc ** и ** desc ** классы - это классы детей ** Coltitle **? – VictorCreator

+0

@ Zyril: может быть, вы правы, потому что, когда я делаю «colElements.childrenNodeSize», я просто получаю 1: - | Любые предложения относительно того, как я могу выбрать связанные друг с другом узлы? – VictorCreator

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