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

Odpovedet emailem