Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将换行符替换为<;br>;在子元素内部使用Jsoup_Java_Html_Jsoup - Fatal编程技术网

Java 将换行符替换为<;br>;在子元素内部使用Jsoup

Java 将换行符替换为<;br>;在子元素内部使用Jsoup,java,html,jsoup,Java,Html,Jsoup,我在替换所有中的换行符时遇到问题; String body = "<p>This is the output:</p>\n<pre class=\"lang-xml prettyprint prettyprinted\">\n<code><span class=\"dec\">&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://

我在替换所有
中的换行符时遇到问题;
String body = "<p>This is the output:</p>\n<pre class=\"lang-xml prettyprint prettyprinted\">\n<code><span class=\"dec\">&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"&gt;</span><span class=\"pln\">\n</span><span class=\"tag\">&lt;HTML&gt;</span><span class=\"pln\">\n    </span><span class=\"tag\">&lt;HEAD&gt;</span><span class=\"pln\">\n        </span><span class=\"tag\">&lt;META</span><span class=\"pln\"> </span><span class=\"atn\">http-equiv</span><span class=\"pun\">=</span><span class=\"atv\">\"Content-Type\"</span><span class=\"pln\"> </span><span class=\"atn\">content</span><span class=\"pun\">=</span><span class=\"atv\">\"text/html; charset=iso-8859-1\"</span><span class=\"tag\">&gt;</span><span class=\"pln\">\n        </span><span class=\"tag\">&lt;TITLE&gt;</span><span class=\"pln\">GeteBayOfficialTime</span><span class=\"tag\">&lt;/TITLE&gt;</span><span class=\"pln\">\n    </span><span class=\"tag\">&lt;/HEAD&gt;</span><span class=\"pln\">\n    </span><span class=\"tag\">&lt;BODY&gt;</span><span class=\"pln\">\n\n* About to connect() to api.ebay.com port 443 (#0)\n*   Trying 66.135.211.100... * Timeout\n*   Trying 66.135.211.140... * Timeout\n*   Trying 66.211.179.150... * Timeout\n*   Trying 66.211.179.180... * Timeout\n*   Trying 66.135.211.101... * Timeout\n*   Trying 66.211.179.148... * Timeout\n* connect() timed out!\n* Closing connection #0\n</span><span class=\"tag\">&lt;P&gt;</span><span class=\"pln\">Error sending request</span></code></pre>";
            log.info("printing before creating a Jsoup Doc "+  body);
            Document bodyDom = Jsoup.parse(body);
            log.info("printing after creating a Jsoup Doc "+  bodyDom.html());

            Elements preTags = bodyDom.getElementsByTag("pre");

            for (Element pre : preTags) {
                pre.html(pre.html().replaceAll("(\r\n|\n)", "<br />"));
                log.info("Pre element with linebreaks replaced -" + pre);
            }

            body = bodyDom.html();
log.info(“创建Jsoup单据前打印”+正文); documentbodydom=Jsoup.parse(body); log.info(“创建Jsoup文档后打印”+bodyDom.html()); Elements preTags=bodyDom.getElementsByTag(“pre”); 适用于(元素前:预标记){ pre.html(pre.html().replaceAll(“(\r\n |\n)”,“
”); 日志信息(“替换换行符的前置元素-”+前置元素); } body=bodyDom.html();
这是日志,似乎html源代码在解析Jsoup文档后丢失了换行符:

    Jsoup.parse("\nText\nNex").html();
**2013-12-10 10:14:59信息格式测试:166**-在创建Jsoup文档之前打印这是输出:

!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML4.01//EN”http://www.w3.org/TR/html4/loose.dtd"
HTML
头
META http equiv=“Content Type”Content=“text/html;字符集=iso-8859-1“
TITLEGeteBayOfficialTime/TITLE
/头
身体
*即将连接()到api.ebay.com端口443(#0)
*正在尝试66.135.211.100…*超时
*正在尝试66.135.211.140…*超时
*正在尝试66.211.179.150…*超时
*正在尝试66.211.179.180…*超时
*正在尝试66.135.211.101…*超时
*正在尝试66.211.179.148…*超时
*connect()超时!
*正在关闭连接#0
发送或发送请求
**2013-12-10 10:14:59信息格式测试:168**-创建Jsoup文档后打印 这是输出:

!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML4.01//EN”http://www.w3.org/TR/html4/loose.dtd“HTML HEAD META http equiv=“Content Type”Content=“text/HTML;charset=iso-8859-1“TITLEGeteBayOfficialTime/TITLE/HEAD BODY*即将连接()到api.ebay.com端口443(#0)*尝试66.135.211.100…*超时*尝试66.135.211.140…*超时*尝试66.211.179.150…*超时*尝试66.211.179.180…*超时*尝试66.135.211.101…*超时*尝试66.211.179.148…*超时*连接()超时!*正在关闭连接#0或发送请求
2013-12-10 10:14:59信息格式测试:174-替换换行符的前置元素-
!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML 4.01//EN”http://www.w3.org/TR/html4/loose.dtd“HTML HEAD META http equiv=“Content Type”Content=“text/HTML;charset=iso-8859-1“TITLEGeteBayOfficialTime/TITLE/HEAD BODY*即将连接()到api.ebay.com端口443(#0)*尝试66.135.211.100…*超时*尝试66.135.211.140…*超时*尝试66.211.179.150…*超时*尝试66.211.179.180…*超时*尝试66.135.211.101…*超时*尝试66.211.179.148…*超时*连接()超时!*正在关闭连接#0或发送请求
不确定出了什么问题。这是另一个html源代码- “\n响应:\n某些文本\n\ndsjkhskjdh sdjhasjkdas\n”

正确转换为-
响应:
某些文本

    text nex

不确定为什么第一个示例没有!!

问题是当您尝试这样做时:

    Document bodyDom = Jsoup.parse(body.replaceAll("(\\r\\n|\\n)", "<br />"));
你会得到:

    Pattern preP = Pattern.compile("<pre.*?>.+?</pre>", Pattern.DOTALL
            | Pattern.CASE_INSENSITIVE);
    Matcher m = preP.matcher(body);
    while (m.find()) {
        String toReplace = m.group();
        String replaced = toReplace.replaceAll("(\r\n|\n)", "<br />");
        body = body.replace(toReplace, replaced);
    }
从中,您可以执行以下操作:

    Document.OutputSettings outputSettings = new Document.OutputSettings()
            .prettyPrint(false);
    body = Jsoup.clean(body, "", Whitelist.relaxed(), outputSettings);
,Pattern.DOTALL |模式(不区分大小写); 匹配器m=准备匹配器(主体); while(m.find()){ 字符串toReplace=m.group(); 字符串replaced=toReplace.replaceAll(“(\r\n |\n)”,“
”; 车身=车身.更换(更换,更换); }
+*
是一个贪婪的限定符,它与
/pre
的第一次出现相匹配,您可以尝试使用正则表达式,但这是不可能的,请参阅以获得更好的解释。我建议您使用下一个选项

您可以看到正则表达式的示例

clean
解析前的字符串 从中,您可以使用:

以及之后(如原始代码中所示):

pre.html(pre.html().replaceAll(“(\r\n |\n)”,“
”);
prettyPrint
选项使
clean
方法退出换行符,然后解析器正确处理它


干杯

由于您的HTML示例不是一个完整的页面,您可能会更幸运地使用它。谢谢,我们会尝试一下并让您知道。不幸的是,这没有帮助,它仍然会删除所有换行符。您好,谢谢您的回答。但是,这并没有帮助,因为-如果您查看代码,我希望仅在Pre元素中用
替换换行符。在解析前用Jsoup替换它们将无法达到目的,因为在解析Pre元素之前,我将丢失所有换行符。您好,我添加了更多代码来处理您的案例,在我的本地测试中,它是有效的,请告诉我是否我错了。谢谢你的努力。快速提问,这是否考虑了具有任何属性或根本没有属性的pre元素?我现在就来试试。谢谢你的回答,正则表达式解决方案很有效。我现在唯一的问题是,这是否匹配任何具有任何属性或没有属性的pre元素?这也会处理嵌套的pre元素吗?嗨,Eswar,正则表达式的
*?
部分带有标记,使其匹配任意数量的属性(并且没有属性)。我现在正在用嵌套的
pre的
进行尝试,但它不起作用,我将用正确的版本更新mi答案。另一个大问题是不平衡的
pre
,regex只匹配平衡的。
    Pattern preP = Pattern.compile("<pre.*?>.+?</pre>", Pattern.DOTALL
            | Pattern.CASE_INSENSITIVE);
    Matcher m = preP.matcher(body);
    while (m.find()) {
        String toReplace = m.group();
        String replaced = toReplace.replaceAll("(\r\n|\n)", "<br />");
        body = body.replace(toReplace, replaced);
    }
    Document.OutputSettings outputSettings = new Document.OutputSettings()
            .prettyPrint(false);
    body = Jsoup.clean(body, "", Whitelist.relaxed(), outputSettings);
    pre.html(pre.html().replaceAll("(\r\n|\n)", "<br />"));