问题描述
刚接触htmlparser,想用htmlparser解析字符串测试文本一<input name="text1" type="text" value="text1">测试文本二Stirng sText="测试文本一<input name="&quot;text1"/" type="&quot;text"" value="&quot;text1"">测试文本二其他数据;";Parser parser = new Parser(); // parser.setURLparser.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()方法实现不了,还是要请教大家了,谢谢哈
解决方案
楼上的代码是正解,可以解决这个问题,但是返回的结果如果span元素还有parent元素的话就不正确了,当然前提是不知道要解析的html代码是什么样的,所以应该这样做:public String parse(String text) { String tmp = "<html><body>" + text + "</body></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();}
解决方案二:
引用非常感谢大家的帮忙,尤其是lzj0470和ferreousbox,上面的问题已经解决 楼主如果觉得好的话,应该将积分奖给最好的答案。这样才能创造更好的问答氛围
解决方案三:
/** * @param args * @throws ParserException */public static void main(String[] args) throws ParserException {// TODO Auto-generated method stubString 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=<span style=background-color: lime name=first value=bbb><b>测试文本一</b></span><span style=background-color: lime name=first value=bbb>测试文本二</span>
解决方案四:
引用我已经用span过滤掉了其他内容,部分源码如上,我现在想将上面文本中的<span>标签中的name="first"的value值改为"bbb",然后返回所有文本即改过的(sText),但是不能用sText.replace()方法,因为原文本中可能有多个value="aaa"的值.这句话不是很理解楼主可以发一份你用的htmlparser.jar版本给我,或者放到你的博客上面吗?
解决方案五:
不如用用nekohtml+dom4j,因为虽然htmlparser堪称经典,但有些老了,并且也没有版本升级了。