Wie mehrere Zeilen gleichzeitig aus Datei einlesen?

kela_root

Mitglied
Hallo Leute,

ich habe folgendes Problem. Ich habe eine Datei ,die ich einlesen und gewisse Informationen herausparsen will. Das Problem hierbei ist, dass es sich bei dem Quelldokument um eine JSP Datei handelt und ich muss aus diesem gewisse Tags raussuchen. Die Tags haben folgendes Format:

<fe:message key="12345" bundle="resource.bundle" />
oder
<fe:message bundle="resource.bundle" key="12345" >

dabei kann es passieren, dass durch Formatierung in den einzelnen Zeilen dann sowas steht
<fe:message oder <fe:message key="12345" .

Ich habe bereits die passenden regulären Ausdrücke um diese Tags zu matchen, aber leider weiß ich nicht wie ich die gesamte Datei matchen kann. Wenn ich per BufferedReader einlese habe ich ja immer nur einzelne Zeilen und da nützen mir dann die RegExp nichts mehr.

Habt ihr eine Idee wie ich aus der Datei alle Tags herausbekomme, die matchen?

Vielen Dank für eure Hilfe.
 
Meine spontane Idee wäre es einen (z.B. JAXP) XML-Parser zu benutzen, welcher ja mit Tags umgehen kann. Angabe ohne Gewähr auf Funktionalität.
 
So ich habe mir meine Lösung gebastelt, was eigentlich ziemlich einfach war, hatte vorher wohl ne kleine Denkblockade.

Hier meine Lösung:

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Stefan Kaehler (
 * @version v.0.1
 * @since 25.09.2009
 */
public class TagFinder {


    /**
     * Reads the given file into a map where key is the line number and value is
     * the line itself.
     * 
     * @param file
     * @return file as map with line numbers
     * @throws IOException
     */
    private Map<Integer, String> readLinesFromFile(File file)
            throws IOException {
        Map<Integer, String> fileAsMap = new HashMap<Integer, String>();
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line;
        int lineNr = 1;
        while ((line = reader.readLine()) != null) {
            fileAsMap.put(Integer.valueOf(lineNr), line);
            lineNr++;
        }
        return fileAsMap;
    }


    /**
     * Gets all tag elements from file which contain the required attributes.
     * For example, if you want all &lt;input&gt tags that contain name and
     * value attribute, requirements may look like this:<br>
     * String[] req = {"name=", "value="};<br>
     * 
     * @param requirements - required attributes for tag
     * @param fileAsMap - resource as a map
     * @param tagStart - starting of tag (e.g. &lt;input )
     * @param tagEnd - ending of tag (e.g <b>/&gt;</b> or <b>&lt;a&gt;</b>)
     * @return a list with all tag that matches the requirements
     */
    public List<String> getTags(String[] requirements,
            Map<Integer, String> fileAsMap, String tagStart, String tagEnd) {
        List<String> tags = new ArrayList<String>();
        for (Integer lineNr : fileAsMap.keySet()) {
            StringBuffer currentLine = new StringBuffer(fileAsMap.get(lineNr));
            if (currentLine.toString().contains(tagStart)) {
                int tempNr = lineNr + 1;
                /*
                 * while string contains not the required attributes from tag,
                 * iterate over following lines and construct the tag till it
                 * fits the requirements
                 */
                while (!fulfillRequirements(currentLine.toString(),
                        requirements, tagEnd)) {
                    currentLine.append(fileAsMap.get(tempNr));
                    tempNr++;
                }
                tags.add(currentLine.toString());
            }
        }
        return tags;

    }

    /**
     * Checks whether the tag contains all requiremtents or not.
     * 
     * @param s - tag
     * @param requirements - required attributes for tag
     * @param tagEnd - ending of tag
     * @return true if tag is correct otherwise false
     */
    private boolean fulfillRequirements(String s, String[] requirements,
            String tagEnd) {
        // if any requirement is missing, return false
        for (int i = 0; i < requirements.length; i++) {
            if (!s.contains(requirements[i])) {
                return false;
            }
        }
        // if tag isn't terminated correctly, return false
        if (!s.contains(tagEnd)) {
            return false;
        }
        return true;
    }
}

Über Verbesserungsvorschläge, Änderungen, Tipps etc. würde ich mich freuen.
 

Neue Beiträge

Zurück