Jsoup после метода не работает так, как ожидалось - PullRequest
2 голосов
/ 27 июня 2019

У меня есть метод, который имеет описание свойства типа «Элемент», а затем я пытаюсь добавить другой элемент, используя метод Jsoup.after.

Однако, он производит

Exception in thread "main" java.lang.IllegalArgumentException: Object must not be null.

С другой стороны, метод добавления работает так хорошо, но я не то, что я действительно хочу.

Код ниже:

private static void buildTotalvaluesTable2()
{
    Element readyDesc = new Element("p style=\"margin-top:5px\">This is description</p");

    Element totalValuesTable = new Element("table style=\"width:100%; border: 0px; margin-top:20px;\" class=\"hidden\">" +
            "<tbody></tbody>" +
            "</table");

    readyDesc.after(totalValuesTable.outerHtml());

    System.out.println(readyDesc.outerHtml());
}

Чего я действительно хочу достичь, так это просто totalValuesTable, идущего после readyDesc.

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 27 июня 2019

Давайте начнем с объяснения того, что значит установить элемент b как родственный элемент a (здесь представлен a.after(b)).
Вкратце это означает размещение элемента b в parent элементе элемента a в позиции рядом с (после) a элементом.

Итак, на данный момент мы видим, что основная проблема с вашим кодом состоит в том, что он не предоставляет никакой ссылки на родительский элемент , в который должен быть помещен брат или сестра .

Простым решением было бы

  1. создать Element или Document, представляющий родителя,
  2. назначить элемент a как дочерний элемент родительского элемента
  3. (только после 1. 2.) присвойте элемент b в качестве родственного элемента a,

Другими словами что-то вроде:

Element parent = new Element("body");

Element a = ...
parent.appendChild(first); // create parent-child relation

Element b = ...
a.after(b);      // now `a` knows about its parent element so it knows 
                 // to which element append `b`

Вторая проблема заключается в том, что вы неправильно используете new Element(...) в

new Element("p style=\"margin-top:5px\">This is description</p");

Цель этого конструктора не в создании и настройке , а только в создании HTML-элемента. Настройка этого элемента должна быть сделана позже.

Другими словами, не используйте new Element("<tag with='attributes'>and other elements</tag>"), а new Element("tagName"), и настройте этот элемент с помощью специальных методов, таких как:

Element readyDesc = new Element("p");//use only name of tag, without < and >
System.out.println(readyDesc); //raw form: <p></p>

//customize tag
readyDesc.attr("style", "margin-top:5px");
readyDesc.text("This is description");
System.out.println(readyDesc);//customized: <p style="margin-top:5px">This is description</p>
...