vslimit
vslimit
2008-11-06 12:21
浏览 257
已采纳

如何用htmlparser修改html中标签的内容

刚接触htmlparser,想用htmlparser解析字符串

测试文本一<input name="text1" type="text" value="text1">

测试文本二

Stirng sText="

测试文本一<input name="\&amp;quot;text1\&quot;/" type="\&amp;quot;text\&quot;" value="\&amp;quot;text1\&quot;">

测试文本二其他数据;\"; Parser parser = new Parser(); // parser.setURL parser.setInputHTML(sText); parser.setEncoding(parser.getEncoding()); NodeFilter filter = new NodeClassFilter(Span.class); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { if (list.elementAt(i) instanceof Span) { Span spanTag = (Span ) list.elementAt(i); textnode.setAttributeEx(textnode.getAttributeEx("name"));        if(spanTag .getAttribute("name").equals("first")){         spanTag .setAttribute("value", "bbb");       } } }

我已经用span过滤掉了其他内容,部分源码如上,我现在想将上面文本中的标签中的name="first"的value值改为"bbb",然后返回所有文本即改过的(sText),但是不能用sText.replace()方法,因为原文本中可能有多个value="aaa"的值.

 

大家有什么好的建议,最好是直接可以用htmlparser处理的.谢谢


问题补充:
非常感谢大家的帮忙,尤其是lzj0470和ferreousbox,上面的问题已经解决,

如果现在我想将字符串
"

测试文本一<input name="text1/" type="text" value="text1">

测试文本二其他数据;"
中的"测试文本二"替换成"此处已经被替换";即返回的字符串为:
"

测试文本一<input name="text1/" type="text" value="text1">

此处已经被替换其他数据;"

这样该怎么实现,因为span标签中还含有等标签,而我对正则表达式又不熟,所以,sText.replace()方法实现不了,还是要请教大家了,谢谢哈

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • iteye_8101
    iteye_8101 2008-11-06 22:46
    已采纳

    楼上的代码是正解,可以解决这个问题,但是返回的结果如果span元素还有parent元素的话就不正确了,当然前提是不知道要解析的html代码是什么样的,所以应该这样做:
    public String parse(String text) {
    String tmp = "

    " + text + "</html";
    NodeList list = Parser.createParser(tmp, "GB2312").parse(new TagNameFilter("body"));
    Node body = tmp.elementAt(0);
    body.accept(new NodeVisitor() {
    public void visitTag(Tag tag) {
    if (tag.getClass() != Span.clss) return;
    // replace attribute here,i ignore the code
    ......
    }
    });
    return body.toHtml();
    }
    点赞 评论
  • javazhujf01
    javazhujf01 2008-11-06 12:21

    不如用用nekohtml+dom4j,
    因为虽然htmlparser堪称经典,但有些老了,
    并且也没有版本升级了。

    点赞 评论
  • sptzone
    sptzone 2008-11-06 14:02

    [quote]我已经用span过滤掉了其他内容,部分源码如上,我现在想将上面文本中的标签中的name="first"的value值改为"bbb",然后返回所有文本即改过的(sText),但是不能用sText.replace()方法,因为原文本中可能有多个value="aaa"的值.[/quote]

    这句话不是很理解

    楼主可以发一份你用的htmlparser.jar版本给我,或者放到你的博客上面吗?

    点赞 评论
  • lzj0470
    lzj0470 2008-11-06 17:43
    /**
     * @param args
     * @throws ParserException 
     */
    public static void main(String[] args) throws ParserException {
        // TODO Auto-generated method stub
        String sText="<p><span style=background-color: lime name=first value=aaa><b>测试文本一</b></span><input type=text value=text1 name=text1/><p><span style=background-color: lime name=first value=aaa>测试文本二</span>其他数据;";  
        String sText_new = "";
        Parser parser = new Parser(sText);
        NodeList list = parser.parse(
                new TagNameFilter("span")
        );
        if(list.size()>0){
            for(int i=0; i < list.size(); i++){
                Span span = (Span)list.elementAt(i);
                span.setAttribute("value", "bbb");
            }
            sText_new = list.toHtml();
        }
        System.out.println("sText_new="+sText_new);
    }
    

    结果是sText_new=测试文本一测试文本二

    点赞 评论
  • sptzone
    sptzone 2008-11-07 22:51

    [quote]非常感谢大家的帮忙,尤其是lzj0470和ferreousbox,上面的问题已经解决 [/quote]

    楼主如果觉得好的话,应该将积分奖给最好的答案。
    这样才能创造更好的问答氛围 :)

    点赞 评论

相关推荐