HTML для форматирования текста

Существуют ли какие-либо java-API, которые выполняют аналогичные действия, такие как Html.fromHtml (), как в Android? JSoup анализирует и удаляет теги, но результат не является форматированным. например:

<ol type="1"> <li>Test1</li> <ol type="a"> <li>TestA1</li> <li>TestB1</li> </ol> <li>Test2</li> <ol type="a"> <li>TestA2</li> <li>TestB2</li> </ol> </ol> 

Должен дать мне что-то вроде

  1. Test1

    а. TestA1

    б. TestB1

  2. Test2

    а. TestA2

    б. TestB2

Нет никакого api для jsoup-to-"formated text" , но вы можете конвертировать списки самостоятельно:

  1. Итерация по всем дочерним элементам ul / ol который является корнем списка
  2. If item : format и добавить вывод String
  3. Если подсписка : сделайте 1. – но с элементом подсписок – и добавьте результат

Пример:

В этом примере я использую атрибут type чтобы определить, какая пуля требуется, и используйте символ (!) Для индексации элементов. Если нет соответствующего атрибута, используется символ 1 .

Реализация:

 /** * Convert the Listelement <code>root</code> to a formated string-representation. * * @param root Rootelement of the list (normally 'ul' or 'ol' tag) * @param depth Depth of the list (<code>=0</code> for root element) * @return List as String */ public String createList(Element root, int depth) { final String indentation = createIndentation(depth); // create indentation StringBuilder sb = new StringBuilder(); final String typeAttr = root.attr("type"); // Get the character used as bullet (= 'type' attribute) char type = typeAttr.isEmpty() ? '1' : typeAttr.charAt(0); // if 'type' attribute: use it, else: use '1' instead for( Element sub : root.children() ) // Iterate over all Childs { // If Java < 7: use if/else if/else here switch( sub.tagName() ) // Check if the element is an item or a sublist { case "li": // Listitem, format and append sb.append(indentation).append(type++).append(". ").append(sub.ownText()).append("\n"); break; case "ol": // Sublist case "ul": if( !sub.children().isEmpty() ) // If sublist is not empty (contains furhter items) { sb.append(createList(sub, depth + 1)); // Recursive call for the sublist } break; default: // "Illegal" tag, do furhter processing if required - output as an example here System.err.println("Not implemented tag: " + sub.tagName()); } } return sb.toString(); // Return the formated List } /** * Create an Indentationstring of <code>length</code> blanks. * * @param length Size of indentation * @return Indentationstring */ private String createIndentation(int length) { StringBuilder sb = new StringBuilder(length); for( int i=0; i<length; i++ ) { sb.append(' '); } return sb.toString(); } 

Testcode:

  Document doc = ... // Load / parse your document here Element listRoot = doc.select("ol").first(); // Select the root-element (!) of the list here. final String output = createList(listRoot, 0); // Convert the list System.out.println(output); // Ouput 

Результат:

Вход (HTML):

 <ol type="1"> <li>Test1</li> <ol type="a"> <li>TestA1</li> <li>TestB1</li> </ol> <li>Test2</li> <ol type="a"> <li>TestA2</li> <li>TestB2</li> </ol> </ol> 

Вывод:

 1. Test1 a. TestA1 b. TestB1 2. Test2 a. TestA2 b. TestB2 

Это оно! 🙂