2016-05-31 4 views
0

Я использую Jsoup 1.9.2 для обработки и очистки некоторых XML-данных определенных тегов. Во время этого я заметил, что Jsoup ведет себя странно, когда его просят очистить теги title. В частности, другие теги XML в теге title не удаляются и фактически заменяются их экранированными формами.Jsoup clean title tag failure

Для этого я разработал короткий единичный тест, как показано ниже. Тест не проходит, поскольку output выходит со значением CuCl<sub>2</sub>.

@Test 
public void stripXmlSubInTitle() { 
    final String input = "<title>CuCl<sub>2</sub></title>"; 
    final String output = Jsoup.clean(input, Whitelist.none()); 
    assertEquals("CuCl2", output); 
} 

Если title тег заменяется другими тегами (например, p или div), то все работает, как ожидалось. Любое объяснение и обходное решение будут оценены.

+0

http://stackoverflow.com/questions/8683018/jsoup-clean-without-adding-html-entities – maztt

ответ

0

Тег title должен использоваться в пределах head (или в HTML5 в пределах html). Поскольку он используется для отображения заголовка документа HTML, в основном в окне браузера/вкладке, он не должен иметь дочерние теги.

JSoup рассматривает его иначе, чем теги реального контента, такие как p или div, то же самое относится к textarea.

Edit:

Вы могли бы сделать что-то вроде этого:

public static void main(String[] args) { 
    try { 
     final String input = "<content><title>CuCl<sub>2</sub></title><othertag>blabla</othertag><title>title with no subtags</title></content>"; 
     Document document = Jsoup.parse(input); 
     Elements titles = document.getElementsByTag("title"); 
     for (Element element : titles) { 
      element.text(Jsoup.clean(element.ownText(), Whitelist.none())); 
     } 
     System.out.println(document.body().toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Что бы вернуть:

<body> 
<content> 
    <title>CuCl2</title> 
    <othertag> 
    blabla 
    </othertag> 
    <title>title with no subtags</title> 
</content> 
</body> 

В зависимости от ваших потребностей, некоторые корректировки должны быть сделаны, например,

System.out.println(Jsoup.clean(document.body().toString(), Whitelist.none())); 

Что бы вернуть:

CuCl2 blabla title with no subtags 
+0

Спасибо! Мои документы не являются чистым HTML, хотя они являются XML с некоторыми (кстати) HTML-тегами. Можете ли вы рекомендовать способ избежать этого (кроме замены регулярного выражения)? Мне нравится/нужен белый список Jsoup. – Claudiu

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