Разбор сложного XML с помощью Jsoup - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь проанализировать документ в формате XML с помощью Jsoup, в частности, что находится в теге абзаца в приведенном ниже примере кода.

...
<nitf:body.content>
     <p> Content would be here. </p>
</nitf:body.content>
...

В документе несколько тегов абзаца. В результате я решил использовать синтаксис селектора, чтобы попасть внутрь тега body.content, а затем тега абзаца под ним. Я пытаюсь и не могу получить это прямо сейчас с:

// epochFileDoc is the name of the document with the code shown above.
Element tag_element = epochFileDoc.selectFirst("nitf|body.content > p");

Я пробовал несколько различных комбинаций синтаксиса селектора, включая «nitf | content.body> p» и «nitf | body> p». Ни один из тех, что я пробовал, не работал.

Как бы я использовал синтаксис селектора в Jsoup, чтобы получить тег абзаца, показанный выше?

РЕДАКТИРОВАТЬ: я понимаю, почему content.body не работает в синтаксисе селектора, так как он ищет в тегах nitf: content = "body", но я все еще не знаю, как получить этот элемент.

1 Ответ

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

Причина, по которой невозможно выбрать с помощью селектора CSS, как использует Jsoup, заключается в том, что точка имеет особое значение в CSS (как сказал @Shlomi Fish). В своем коде я заменил экземпляры nitf: body.content на nitf: body-content, используя строку ниже, где file - строка, в которой хранится XML:

file = file.replace("<nitf:body.", "<nitf:body-");

Это позволило мне выбрать элемент, используя:

Element tag_element = epochFileDoc.selectFirst("nitf|body-content > p");

Было бы разумнее использовать другой синтаксический анализатор для кода в формате XML в подобных случаях, но если у вас есть такие требования, как у меня / хотите сохранить Jsoup, этот обходной путь работает правильно.

...