Tak si odpovidam sam. Zkousim "Jericho HTML Parser" (http://sourceforge.net/projects/jerichohtml/)
A na prvni pohled to splnuje moje pozadavky (tj. vypise i tagy, ktere jsou v attributu jineho tagu). Prikladam kus kodu, ktery z JSP souboru produkuje zhruba tento vystup: [1,1]->[1,90]: <%@ page language="java" contentType="text/html; charset=CP1250" pageEncoding="CP1250" %> [2,1]->[2,80]: <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-tc" prefix="html" %> [3,1]->[3,77]: <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> [5,1]->[5,10]: <cb:body> [6,1]->[6,12]: <cb:errors> [8,1]->[8,22]: <div class="content"> [10,1]->[10,5]: <h2> [10,5]->[10,93]: <cb:message key="hlaska007" text="Informace o produktu" /> [10,93]->[10,121]: <cb:hlp key="HLPPROD123"/> [10,121]->[10,126]: </h2> ... [28,1]->[28,7]: </div> [30,1]->[30,13]: </cb:errors> [31,1]->[31,11]: </cb:body> Je to doopravdy pouze na ukazku: import net.htmlparser.jericho.CharacterReference; import net.htmlparser.jericho.Segment; import net.htmlparser.jericho.Source; import net.htmlparser.jericho.StartTag; import net.htmlparser.jericho.StartTagType; import net.htmlparser.jericho.Tag; private static void _trace(Source aParser, Segment aTag) { int beginOffset = aTag.getBegin(); int beginRow = aParser.getRow(beginOffset); int beginColumn = aParser.getColumn(beginOffset); int endOffset = aTag.getEnd(); int endRow = aParser.getRow(endOffset); int endColumn = aParser.getColumn(endOffset); String content = CharacterReference.decodeCollapseWhiteSpace(aTag.toString()); System.out.println(String.format("[%d,%d]->[%d,%d]: %s" , beginRow, beginColumn, endRow, endColumn, content)); } private void _doIt(File aFile) throws IOException { Reader r = new BufferedReader(new FileReader(aFile)); Source source=new Source(r); //Tags: <% ... %> List<StartTag> jspSpecificTags = source.getAllStartTags(StartTagType.SERVER_COMMON); for (StartTag tag : jspSpecificTags) { _trace(source, tag); } //All Start/End tags but <% ... %> Tag[] allTags = source.fullSequentialParse(); for (Tag tag : allTags) { if (!StartTagType.SERVER_COMMON.equals(tag.getTagType())) { _trace(source, tag); } } } Tagy ctu dvema zpusoby: - Bud pouze startovaci (trida StartTag) u tagu <% ... %> - Anebo vsechny (trida Tag - startovaci i koncove) s tim, ze si <% ... %> odfiltruju. V tomto pripade je to neoptimalni, protoze parseruju 2x (source.getAllStartTags, source.fullSequentialParse). Klidne bych vystacil s source.fullSequentialParse(), ale chtel jsem ukazat i tu prvni moznost.... Doufam sem za par dni nebudu vykrikovat, jaky jsou s parserem potize. :-) -- Michal Polák > -----Původní zpráva----- > Od: konference-boun...@java.cz [mailto:konference-boun...@java.cz] za > uživatele Polak Michal > Odesláno: 19. června 2008 14:00 > Komu: javacz (konference@java.cz) > Předmět: Hledám JSP parser > > Zdravím, > > Potřeboval bych umět v JSP vyhledat obsah některých mých (daného .tld) > tagů a jejich attributů. > > Tedy např. pro > > <%@ taglib uri="http://mojeurl/moje.tld" prefix="trdlo" %> > > tagy <trdlo:info>, <trdlo:error>, <trdlo:message>. I počet bytů/znaků > od začátku dokumentu, řádek a sloupec výskytu. > > JSP podle mne nic nepředepisuje, tagy mohou ležet prakticky libovolně > (i třeba v attributech jiných tagů, že ano....). Resp. v již > existujících JSP je mám obsažené a JSP zobrazují co chtěno, tj. obsah > JSP je "správný". > > JSP jsou psána v xhtml (ale není to zaručeno, tedy hledaný parser by se > měl umět vyrovnat i s HTML a XML). > > Zatím jsem si (už před lety) zbastlil takovou naivní implementaci > pomocí regulárních výrazů. Ale to se nedokážu vyrovnat např. s > komentáři, a stejně tak mám problém určit pozici, řádek a sloupec. > Netvrdím, že by to nešlo, ale hledám jednodušší už hotové řešení. > > Abych si psal celý lexer a parser sám, tak to se mi opravdu nechce. > > Máte třeba někdo pozitivní zkušenosti s > javax.swing.text.html.HTMLEditorKit? > Před lety mi v HTML zatloukal některé attributy a od té doby se jej > bojím použít. > > Anebo neumíte někdo použít JSP parser třeba z Tomcatu? Tuším se jmenuje > Jasper (bohužel stejně jako tiskový framework). > > Webových kontejnerů je přece mraky, někdo snad zveřejní svůj parser. > > Budu vděčen za jakékoliv rady. > > Děkuji. > > -- > Michal Polák