Java SAX Parsing

Есть поток XML, который мне нужно проанализировать. Поскольку мне нужно сделать это только один раз и построить свои java-объекты, SAX выглядит естественным выбором. Я расширяю DefaultHandler и реализую методы startElement, endElement и characters, имея члены в моем классе, где я сохраняю текущее значение чтения (взятое в методе символов).

У меня нет проблем с тем, что мне нужно, но мой код стал довольно сложным, и я уверен, что для этого нет причин, и что я могу делать что-то по-другому. Структура моего XML примерно такая:

<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>

Моя проблема началась, когда я понял, что одни и те же имена тегов используются в нескольких областях файла. Например, идентификатор и имя существуют как для игрока, так и для команды. Я хочу создать экземпляры своих классов Java Player и Team. Во время синтаксического анализа я сохранил логические флаги, сообщающие мне, нахожусь ли я в разделе команд, чтобы в endElement я знал, что имя - это название команды, а не имя игрока и так далее.

Вот как выглядит мой код:

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;
        }
    }
}

Поскольку в моем реальном сценарии у меня есть больше узлов для игрока в дополнение к командам, и эти узлы также имеют такие теги, как name и id, я обнаружил, что перепутал несколько логических значений, похожих на в inTeamsSection, и мой метод endElement становится длинным и сложным со многими условиями.

Что мне делать иначе? Как я могу узнать, к чему принадлежит, например, именная бирка?

Спасибо!

14
задан Buhake Sindi 22 December 2011 в 09:44
поделиться