Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 为什么Swing解析器是';s HandletText不处理嵌套标记?_Java_Html_Html Parsing_Escaping_Htmleditorkit - Fatal编程技术网

Java 为什么Swing解析器是';s HandletText不处理嵌套标记?

Java 为什么Swing解析器是';s HandletText不处理嵌套标记?,java,html,html-parsing,escaping,htmleditorkit,Java,Html,Html Parsing,Escaping,Htmleditorkit,我需要转换一些带有嵌套标签的HTML文本,用css属性装饰“匹配项”以突出显示它(如firefox搜索)。 我不能只做一个简单的替换(比如,如果用户搜索了“img”),所以我尝试只在正文文本中进行替换(而不是在标记属性上) 我有一个非常简单的HTML解析器,我认为应该这样做: final Pattern pat = Pattern.compile(srch, Pattern.CASE_INSENSITIVE); Matcher m = pat.matcher(output); if (m.fin

我需要转换一些带有嵌套标签的HTML文本,用css属性装饰“匹配项”以突出显示它(如firefox搜索)。 我不能只做一个简单的替换(比如,如果用户搜索了“img”),所以我尝试只在正文文本中进行替换(而不是在标记属性上)

我有一个非常简单的HTML解析器,我认为应该这样做:

final Pattern pat = Pattern.compile(srch, Pattern.CASE_INSENSITIVE);
Matcher m = pat.matcher(output);
if (m.find()) {
    final StringBuffer ret = new StringBuffer(output.length()+100);
    lastPos=0;
    try {
        new ParserDelegator().parse(new StringReader(output.toString()),
        new HTMLEditorKit.ParserCallback () {
            public void handleText(char[] data, int pos) {
                ret.append(output.subSequence(lastPos, pos));
                Matcher m = pat.matcher(new String(data));
                ret.append(m.replaceAll("<span class=\"search\">$0</span>"));
                lastPos=pos+data.length;
            }
        }, false);
        ret.append(output.subSequence(lastPos, output.length()));
        return ret;
    } catch (Exception e) {
 return output;
    }
}
return output;
final Pattern pat=Pattern.compile(srch,Pattern.CASE\u不区分大小写);
匹配器m=匹配器(输出);
if(m.find()){
最终StringBuffer ret=新的StringBuffer(output.length()+100);
lastPos=0;
试一试{
新建ParserDelegator().parse(新建StringReader(output.toString()),
新的HTMLEditorKit.ParserCallback(){
public void handleText(字符[]数据,整数位置){
ret.append(输出子序列(lastPos,pos));
Matcher m=pat.Matcher(新字符串(数据));
ret.append(m.replaceAll($0));
lastPos=pos+数据长度;
}
},假);
ret.append(output.subSequence(lastPos,output.length());
返回ret;
}捕获(例外e){
返回输出;
}
}
返回输出;
我的问题是,当我调试它时,HandletText会被包含标记的文本调用!就好像只有一层深。有人知道为什么吗?我是否需要对HTMLPasser做一些简单的事情(没有太多使用它)来启用嵌套标记的“正确”行为

PS-我自己想出来的-见下面的答案。简单的回答是,如果您将其传递给HTML,而不是预先转义的HTML,它就可以正常工作。啊!希望这对其他人有帮助

<span>example with <a href="#">nested</a> <p>more nesting</p>
</span> <!-- all this gets thrown together -->
更多嵌套的示例


在XP上使用JDK6对我来说似乎效果不错。我用head和body标记包装了您的示例HTML。我得到了三行输出:

a) 以身作则 b) 嵌套 c) 更多筑巢

以下是我使用的代码:

import java.io.*;
import java.net.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    public void handleText(char[] data, int pos)
    {
        System.out.println( data );
    }

    public static void main(String[] args)
        throws Exception
    {
        Reader reader = getReader(args[0]);
        ParserCallbackText parser = new ParserCallbackText();
        new ParserDelegator().parse(reader, parser, true);
    }

    static Reader getReader(String uri)
        throws IOException
    {
        // Retrieve from Internet.
        if (uri.startsWith("http:"))
        {
            URLConnection conn = new URL(uri).openConnection();
            return new InputStreamReader(conn.getInputStream());
        }
        // Retrieve from file.
        else
        {
            return new FileReader(uri);
        }
    }
}

很抱歉这个误导性的问题-我发现了我的问题,并且它没有包含在我的描述中-我的输入字符串已经过预处理,所以我正在查看文本,例如

<span>example with &lt;a href="#"&gt; nested &gt;/a&lt; &gt;p&lt;more nesting&gt;/p&lt;
</span> <!-- well of course it all gets thrown together -->
带有a href=“#”嵌套/a pmore嵌套/p的示例

这似乎与
handleText
的API文档一致……感谢camickr不辞辛劳地帮助验证这一点。抱歉,我没有给出更好的测试用例-这很有帮助,因为我在尝试通过您的测试代码运行我的示例时发现了问题吉姆·P