Java SAX-Parsing

Gibt es einen XML-stream, die ich brauche, zu analysieren. Da brauche ich nur einmal machen und bauen meine java-Objekte, SAX sieht aus wie die Natürliche Wahl. Ich bin DefaultHandler erweitern und die Umsetzung der startElement, endElement und characters Methoden, mit Mitglieder in meiner Klasse, wo ich speichern Sie den aktuellen Wert Lesen (in der Zeichen-Methode).

Ich habe kein problem, zu tun, was ich brauche, aber mein code ziemlich Komplex und ich bin sicher, es gibt keinen Grund dafür, und das kann ich alles anders machen.
Die Struktur der XML-ist so etwas wie dieses:

<players>
  <player>
    <id></id>
    <name></name>
    <teams total="2">
      <team>
        <id></id>
        <name></name>
        <start-date>
          <year>2009</year>
          <month>9</month>
        </start-date>
        <is-current>true</is-current>
      </team>
      <team>
        <id></id>
        <name></name>
        <start-date>
          <year>2007</year>
          <month>11</month>
        </start-date>
        <end-date>
          <year>2009</year>
          <month>7</month>
        </end-date>
      </team>
    </teams>
  </player>
</players>

Mein problem begann, als ich erkannte, dass die gleichen tag-Namen sind verwendet in mehreren Bereichen der Datei. Zum Beispiel id und name bestehen für beide einen Spieler und ein team. Ich möchte Sie zum erstellen von Instanzen der java-Klassen Spieler und Mannschaft. Während der Analyse, die ich gehalten boolean-flags sagen mir, ob ich in den teams-Abschnitt, so dass in der endElement weiß ich, dass der name, ist ein team-Namen, nicht den Namen des Spielers und so weiter.

Hier ist, wie mein code sieht wie folgt aus:

public class MyParser extends DefaultHandler {

    private String currentValue;
    private boolean inTeamsSection = false;
    private Player player;
    private Team team;
    private List<Team> teams;

    public void characters(char[] ch, int start, int length) throws SAXException {
        currentValue = new String(ch, start, length);
    }

    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        if(name.equals("player")){
            player = new Player();
        }
        if (name.equals("teams")) {
            inTeamsSection = true;
            teams = new ArrayList<Team>();
        }
        if (name.equals("team")){
            team = new Team();
        }
    }   

    public void endElement(String uri, String localName, String name) throws SAXException {
        if (name.equals("id")) {
            if(inTeamsSection){
                team.setId(currentValue);
            }
            else{
                player.setId(currentValue);
            }
        }
        if (name.equals("name")){
            if(inTeamsSection){
                team.setName(currentValue);
            }
            else{
                player.setName(currentValue);
            }
        }
        if (name.equals("team")){
            teams.add(team);
        }
        if (name.equals("teams")){
            player.setTeams(teams);
            inTeamsSection = false;
        }
    }
}

Da in meiner realen Szenario habe ich mehr Knoten an, die ein Spieler zusätzlich zu den teams und diese Knoten-auch tags wie name und id, ich fand mich Durcheinander mit mehreren booleans ähnlich wie die inTeamsSection und meine endElement Methode wird lang und Komplex mit vielen Bedingungen.

Was sollte ich anders machen? Wie kann ich wissen, was für ein name-tag, zum Beispiel, gehört?

Dank!

InformationsquelleAutor der Frage Haji | 2011-12-22

Schreibe einen Kommentar