Я проанализировал HTML с помощью Jsoup, и я пытаюсь получить из него пару значений ключа.
Это файл HTML, который содержит ключевые слова в dt dlterm и значения в dd:
<div class = "section" id = "GUID-1BF02E47-1ECC-4CCF-A903-2A8621DB5FBA__GUID- 20A253C1-02AD-4413-9570-C0178C01E616">
<div class = "p">
<dl class = "dl">
<dt class = "dt dlterm">
<a name = "GUID-1BF02E47-1ECC-4CCF-A903-2A8621DB5FBA__GUID-942CC4F1-90F8- 4B83-9647-A3D086063B0C"><!----></a>Incident</dt>
<dd class = "dd">detials of one</dd>
<dt class = "dt dlterm"><a name = "GUID-1BF02E47-1ECC-4CCF-A903- 2A8621DB5FBA__GUID-0F5CFEC5-6714-4000-A733-79DDB49B4C63"><!----> </a>Risk</dt>
<dd class = "dd">details of it two</dd>
<dt class = "dt dlterm"><a name = "GUID-1BF02E47-1ECC-4CCF-A903- 2A8621DB5FBA__GUID-C731C50A-947F-431B-9CEE-1FFD1BA40EEA"><!----> </a>Event</dt>
<dd class = "dd">detials of it three.</dd>
</dl>
</div>
</div>Вот что я пробовал:
static Map<Object, Object> maps;
public static Map<Object, Object> getSet(Document doc) {
maps = new HashMap<Object, Object>();
String key = "";
String value = "";
Elements elemname1 = doc.getElementsByClass("dt dlterm");
Elements elemname2 = doc.getElementsByClass("dd");
List<Object> keys = new ArrayList<Object>();
List<Object> values = new ArrayList<Object>();
for (Element i : elemname1) {
key = i.ownText();
keys.add(key);
}
for(Element j : elemname2) {
value = j.ownText();
values.add(value);
}
System.out.println(maps);
return maps;
}
public static void main (String args[]) throws Exception {
String filePath = "someFilePath.html";
File input = new File(filePath);
Document doc = Jsoup.parse(input, "UTF-8", "");
getSet(doc);
}
Ожидаемый результат такой:
{
Event = detials of one,
Incident = detials of two,
Risk = detials of three
}
Что я получаю:
{[Incident, Risk, Event] = [detials of one,detials of two,detials of three]}




Вы можете помещать результаты на карту, собирая их в один цикл.
Замените обе петли for на эту:
for (int i = 0; i < elemname1.size(); i++) {
key = elemname1.get(i).ownText();
value = elemname2.get(i).ownText();
maps.put(key, value);
}
выход:
{Risk=details of it two, Event=detials of it three., Incident=detials of one}
Вы можете просто использовать это:
Document document = Jsoup.parse(html);
Elements dts = document.getElementsByClass("dt dlterm");
Elements dds = document.getElementsByClass("dd");
if (dts.size() != dds.size()) {
// ensure same sizes of both lists
}
HashMap<String, String> values = new HashMap<>();
for (int i = 0; i < dts.size(); i++) {
values.put(dts.get(i).text(), dds.get(i).text());
}
Или всего одним оператором с использованием Java Streams:
Map<String, String> values = IntStream.range(0, Math.min(dts.size(), dds.size())).boxed()
.collect(Collectors.toMap(i -> dts.get(i).text(),i -> dds.get(i).text()));
Результат будет таким:
{Risk=details of it two, Event=detials of it three., Incident=detials of one}
Если вы хотите убедиться, что порядок на карте такой же, как в HTML-коде, используйте LinkedHashMap вместо HashMap.