Я пытаюсь проанализировать таблицу в XML-файле, определенном ее HTML-тегами, и создать текстовый документ. Структура таблицы и содержимое должны быть автоматически сгенерированы в текстовом документе. Чтобы анализировать XML с помощью java, я пользуюсь библиотекой Apache poi. Когда я извлекаю значения из XML, я не вижу теги HTML, которые присутствуют или связаны со структурой таблицы. Однако без соответствующих тегов в XML я не могу создать соответствующую таблицу в текстовом документе. Как мне поступить в таком случае?
XML, который я разбираю, имеет одно поле со значениями, расположенными в табличной структуре.
<customfield id = "9999" key = "com.atlassian.jira.plugin.system.customfieldtypes:textarea">
<customfieldname>Product</customfieldname>
<customfieldvalues>
<customfieldvalue>
<div class='table-wrap'>
<table class='conTable'><tbody>
<tr>
<td class='confluenceTd'><ul>
<li>Product1:</li>
</ul>
</td>
<td class='confluenceTd'><ul>
<li>Product2:</li>
</ul>
</td>
</tr>
<tr>
<td class='confluenceTd'><ul>
<li>Product3;/li>
<li>Product4</li>
</ul>
</td>
<td class='confluenceTd'><ul>
<li>Product5</li>
<li>Product6</li>
</ul>
</td>
</tr>
</tbody></table>
</div>
</customfieldvalue>
</customfieldvalues>
</customfield>
Соответствующий HTML выглядит следующим образом
> <customfieldvalues>
> <customfieldvalue> <div class='table-wrap'> <table class='confluenceTable'><tbody> <tr> <td class='confluenceTd'><ul>
> <li>Product1:</li> </ul> </td> <td class='confluenceTd'><ul>
> <li>Product2:</li> </ul> </td> </tr> <tr> <td
> class='confluenceTd'><ul> <li>Product3</li> <li>Product4</li> </ul>
> </td> <td class='confluenceTd'><ul> <li>Product5</li>
> <li>Product6</li> </ul> </td> </tr> </tbody></table> </div>
> </customfieldvalue> </customfieldvalues>
Я обычно анализировал XML, чтобы получить его значение
element.item(n).getChildNodes().item(0).getNodeValue()
После использования htmlUnescape(исходная строка).. когда я делаю string.contains("<tr>") или string.contains("<td>"), почему это всегда ложно? Как я могу получить теги после применения htmlUnescape к строке?
После отмены экранирования символов HTML вы все равно получите строку, а не документ HTML. Если вы хотите проанализировать эту строку как HTML, вы можете использовать инструмент, предназначенный для этого, например JSoup или другие подобные библиотеки.
На самом деле (я не осознавал этого раньше) Jsoup также может справиться с неэкранированием для вас.
Вот базовая демонстрация с использованием Jsoup.
Предполагается, что вы уже извлекли текстовое содержимое из элемента <customfieldvalue>...</customfieldvalue>
.
Итак, теперь у вас есть строка, содержащая:
<div class='table-wrap'> ... </div>
Чтобы извлечь этот контент в виде HTML-документа с помощью Jsoup:
boolean strictMode = true;
String unescapedString = Parser.unescapeEntities(escapedString, strictMode);
Element element = Jsoup.parse(unescapedString).body();
Вы можете перебирать все дочерние элементы этого содержащего элемента:
for (Element element : Jsoup.parse(unescapedString).body().children().select("*")) {
System.out.println(element.nodeName() + " - " + element.ownText());
}
В этом случае все, что я делаю, это печатаю каждый элемент со всеми содержащимися в нем данными.
Результат:
div -
table -
tbody -
tr -
td -
ul -
li - Product1:
td -
ul -
li - Product2:
tr -
td -
ul -
li - Product3;/li>
li - Product4
td -
ul -
li - Product5
li - Product6
Интересно, что вы можете видеть, что в исходных данных есть искаженный экранированный HTML:
<li>Product3;/li>
Получив полный доступ к данным в виде HTML, вы можете обычным способом построить свою таблицу Word, используя POI.
Отвечает ли это на ваш вопрос? Как отменить экранирование символов HTML в Java? Например, здесь показано, как преобразовать строку, содержащую
<div class='table-wrap'>
, в строку, содержащую<div class='table-wrap'>
, и так далее.