Как разобрать содержимое и структуру таблицы из xml в слово с помощью Apache poi?

Я пытаюсь проанализировать таблицу в 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>
    &lt;div class=&apos;table-wrap&apos;&gt;
    &lt;table class=&apos;conTable&apos;&gt;&lt;tbody&gt;
    &lt;tr&gt;
    &lt;td class=&apos;confluenceTd&apos;&gt;&lt;ul&gt;
        &lt;li&gt;Product1:&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/td&gt;
    &lt;td class=&apos;confluenceTd&apos;&gt;&lt;ul&gt;
        &lt;li&gt;Product2:&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;td class=&apos;confluenceTd&apos;&gt;&lt;ul&gt;
        &lt;li&gt;Product3;/li&gt;
        &lt;li&gt;Product4&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/td&gt;
    &lt;td class=&apos;confluenceTd&apos;&gt;&lt;ul&gt;
        &lt;li&gt;Product5&lt;/li&gt;
        &lt;li&gt;Product6&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
    &lt;/div&gt;
         </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()

Отвечает ли это на ваш вопрос? Как отменить экранирование символов HTML в Java? Например, здесь показано, как преобразовать строку, содержащую &lt;div class=&apos;table-wrap&apos;&gt;, в строку, содержащую <div class='table-wrap'>, и так далее.

andrewJames 10.02.2023 14:47

После использования htmlUnescape(исходная строка).. когда я делаю string.contains("<tr>") или string.contains("<td>"), почему это всегда ложно? Как я могу получить теги после применения htmlUnescape к строке?

Jeet 10.02.2023 15:02

После отмены экранирования символов HTML вы все равно получите строку, а не документ HTML. Если вы хотите проанализировать эту строку как HTML, вы можете использовать инструмент, предназначенный для этого, например JSoup или другие подобные библиотеки.

andrewJames 10.02.2023 15:07

На самом деле (я не осознавал этого раньше) Jsoup также может справиться с неэкранированием для вас.

andrewJames 10.02.2023 15:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот базовая демонстрация с использованием Jsoup.

Предполагается, что вы уже извлекли текстовое содержимое из элемента <customfieldvalue>...</customfieldvalue>.

Итак, теперь у вас есть строка, содержащая:

&lt;div class=&apos;table-wrap&apos;&gt; ... &lt;/div&gt;

Чтобы извлечь этот контент в виде 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:

&lt;li&gt;Product3;/li&gt;

Получив полный доступ к данным в виде HTML, вы можете обычным способом построить свою таблицу Word, используя POI.

Другие вопросы по теме