jsoup удалить внешний тег html - код HTML элемент - PullRequest
1 голос
/ 14 февраля 2020

Это кажется довольно простым, но, очевидно, я делаю что-то не так. Вот мой HTML - я пытаюсь создать как теги с единичным кодом, так и теги вложенного кода под предварительными тегами - итоговый контент будет представлять собой «однострочные блоки с кодом внутри», а также с предварительными тегами «большие поля с кодом внутри» , Есть также пустые теги абзаца, от которых я не могу избавиться, используя стандартные методы - удаление элемента после проверки отсутствия текста в абзаце. Вот входные данные

<code>        <h1>Module Description and Learning Objectives</h1>  
        <p> 
        </p> 
        <pre>                
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
        </p>
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
        </p>
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
        </p>
        <p>
        </p>
        

Предложение 1

System.out.println("id:"+element.attr("id"));

Предложение 2

System.out.println("src:"+element.attr("src"));

Предложение 3

System.out.println("alt:"+element.attr("alt"));

Это мой код (не следует за именами столько, сколько за конструкциями, именами в середине кода:)

          Elements pWithCodeTagList = docXMLformat.select("code");
          if (pWithCodeTagList.size() > 0) {
              for (Element pTag : pWithCodeTagList) {
                   System.out.println("pTag=" + pTag.text() + " " + pTag.tagName());
                   pTag.unwrap();
              }
          }

Вот вывод в eclipse - я действительно выбираю теги кода и ожидаю исчезновения родительского p

 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - code
 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title code
 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1 code
 pTag=System.out.println("id:"+element.attr("id")); code
 pTag=System.out.println("src:"+element.attr("src")); code
 pTag=System.out.println("alt:"+element.attr("alt")); code

Это результат: я ожидал, что теги абзаца исчезнут, а не кодовые теги!

<code>   <h1>Module Description and Learning Objectives</h1> 
                <p> 
                </p> 
                <pre>                
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 -
                </p>
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title
                </p>
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1
                </p>
                    <p>
                    </p>
                

Предложение 1

System.out.println ("id:" + element.attr ("id"));

Предложение 2

System.out.println ("sr c:" + element.attr ("sr c"));

Предложение 3

System.out.println ("alt:" + element.attr ("alt"));

Я уже коснулся этой области моего документа, перед этим я удалил тег span вокруг кодового тега, и мне пришлось удалить все элементы управления строкой символы из содержимого строки, возможно, PRE и CODE не работают как другие теги - я знаю, что они не должны, но ... также я пытаюсь сохранить теги и контент в одной строке, чтобы мой "код" Ящики "как можно тоньше", для переключения:

 <pre>                
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1
  

Предложение 1

System.out.println("id:"+element.attr("id"));

Предложение 2

System.out.println("src:"+element.attr("src"));

Предложение 3

System.out.println("alt:"+element.attr("alt"));

1 Ответ

0 голосов
/ 15 февраля 2020

Ваш селектор выбирает элементы code, а не элементы p, поэтому они удаляются. Вы должны выбрать элементы p с тегом code и unwrap(). p:has(code)

Кроме того, вам не нужно повторять их и вызывать развертывание каждого из них, если вы хотите развернуть их все (если вы не хотите делать дополнительные логи c для каждого один). Вы можете просто позвонить Elements#upwrap()

Elements pWithCodeTagList = docXMLformat.select("p:has(code)");
pWithCodeTagList.unwrap();

И чтобы найти пустые теги p, вы можете использовать селектор :matches, который выполняет регулярное выражение над текстом, и просто искать пробелы или ничего: p:matches(^\s?$)

Elements emptyPs = docXMLformat.select("p:matches(^\\s?$)");
emptyPs.remove();
...