2013-03-07 4 views
0

У меня есть следующая проблема:XML SAXParser переформатирование, если еще Java/Android

Я использую XML SAXParser для разбора файла XML и создавать классы динамически и устанавливать их свойства.

Я написал код, который теперь работает, чтобы сделать 4 класса и установить свойства классов, но проблема в том, что код является одним большим условным случаем (если/else if/else) и что его очень трудно читать ,

Я хотел бы разобрать xml, чтобы я мог создать 15 разных классов, поэтому код становится очень большим.

Теперь точный вопрос заключается в том, как реорганизовать if/elseif/else на более читаемый код? Я искал вокруг какое-то время и нашел некоторые методы, как использование карты или шаблона команды, но я не понимаю, как это использовать?

Это код, который я сейчас использую, и что работает:

public class XmlParserSax extends DefaultHandler { 

List<Fragment> fragments = null; 
String atType = null; 
String typeObject; 
String currentelement = null; 
String atColor = null; 
RouteFragment route = null; 
ChapterFragment chapter = null; 
FirstFragment first = null; 
ExecuteFragment execute = null; 
StringBuilder textBuilder; 

public XmlParserSax() { 
    fragments = new ArrayList<Fragment>(); 
    try { 
     /** 
     * Create a new instance of the SAX parser 
     **/ 
     SAXParserFactory saxPF = SAXParserFactory.newInstance(); 
     SAXParser sp = saxPF.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 

     /** 
     * Create the Handler to handle each of the XML tags. 
     **/ 

     String file = "assets/test.xml"; 
     InputStream in = this.getClass().getClassLoader() 
       .getResourceAsStream(file); 

     xr.setContentHandler(this); 
     xr.parse(new InputSource(in)); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 

    atColor = attributes.getValue("color"); 
    atType = attributes.getValue("type"); 
    currentelement = localName; 
    textBuilder = new StringBuilder(); 

    if (localName.equalsIgnoreCase("template")) { 

     if (atType.equalsIgnoreCase("route")) { 

      route = new RouteFragment(); 
      typeObject = "route"; 
     } else if (atType.equalsIgnoreCase("chapter")) { 

      chapter = new ChapterFragment(); 
      typeObject = "chapter"; 
     } else if (atType.equalsIgnoreCase("first")) { 
      first = new FirstFragment(); 
      typeObject = "first"; 
     } else if (atType.equalsIgnoreCase("execute")) { 
      execute = new ExecuteFragment(); 
      typeObject = "execute"; 
     } 
    } else if (localName.equalsIgnoreCase("number")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setNumberTextcolor("#" + atColor); 
     } 
    } else if (localName.equalsIgnoreCase("maxnumber")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setMaxNumberColor("#" + atColor); 
     } 

    } else if (localName.equalsIgnoreCase("title")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setTitleColor("#" + atColor); 
     } else if (typeObject.equalsIgnoreCase("first")) { 
      first.setTitleColor("#" + atColor); 
     } 
    } else if (localName.equalsIgnoreCase("subtitle")) { 
     if (typeObject.equalsIgnoreCase("first")) { 
      first.setSubtitleColor("#" + atColor); 
     } 
    } else if (localName.equalsIgnoreCase("text")) { 
     if (typeObject.equalsIgnoreCase("execute")) { 
      execute.setTextColor("#" + atColor); 
     } 
    } 

} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 

    String text = textBuilder.toString(); 
    if (localName.equalsIgnoreCase("template")) { 
     if (typeObject.equalsIgnoreCase("route")) { 
      fragments.add(route); // nieuw routefragment 
            // toevoegen aan de lijst 

     } else if (typeObject.equalsIgnoreCase("chapter")) { 
      fragments.add(chapter); // nieuw chapterfragment 
            // toevoegen aan de lijst 

     } else if (typeObject.equalsIgnoreCase("first")) { 
      fragments.add(first); 
     } else if (typeObject.equalsIgnoreCase("execute")) { 
      fragments.add(execute); 
     } 
    } else if (localName.equalsIgnoreCase("text")) { 
     if (typeObject.equalsIgnoreCase("route")) { 
      // route.setOmschrijving(text); 
     } else if (typeObject.equalsIgnoreCase("execute")) { 
      execute.setText(text); 
     } 
    } else if (localName.equalsIgnoreCase("background")) { 
     if (typeObject.equalsIgnoreCase("route")) { 
      // route.setKleur("#" + text); 
     } else if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setBackgroundColor("#" + text); 
     } else if (typeObject.equalsIgnoreCase("first")) { 
      first.setBackgroundColor("#" + text); 
     } else if (typeObject.equalsIgnoreCase("execute")) { 
      execute.setBackgroundColor("#" + text); 

     } 
    } else if (localName.equalsIgnoreCase("number")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setNumber(text); 
     } 
    } else if (localName.equalsIgnoreCase("maxnumber")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setMaxNumber(text); 
     } 
    } else if (localName.equalsIgnoreCase("title")) { 
     if (typeObject.equalsIgnoreCase("chapter")) { 
      chapter.setTitle(text); 
     } else if (typeObject.equalsIgnoreCase("first")) { 
      first.setTitle(text); 
     } 
    } else if (localName.equalsIgnoreCase("subtitle")) { 
     if (typeObject.equalsIgnoreCase("first")) { 
      first.setSubtitle(text); 
     } 
    } else if (localName.equalsIgnoreCase("square")) { 
     if (typeObject.equalsIgnoreCase("execute")) { 
      execute.setBorderColor("#" + text); 

     } 
    } 
} 

public List<Fragment> getList() { 
    return fragments; 

} 

@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 

    textBuilder.append(ch, start, length); 

} 

}

+0

Я ответил на что-то подобное некоторое время назад, проверьте это: http://stackoverflow.com/questions/13417363/parsing-an-xml-file-in-android/13417932#13417932 – Atrix1987

+0

@ Atrix1987 Я не вижу почему ваша версия меньше кода? U все еще использует много, если иначе? –

+0

есть еще один способ сделать это, используя начальный элемент и прослушиватели конечных элементов, я отправлю код – Atrix1987

ответ

0

Существует еще один способ сделать это; используя startElementListener и EndTextElementListeners

Сначала определите корневой элемент:

RootElement root = new RootElement("root"); 

Определить ваши дочерние элементы

Element nodeA = root.getChild("nodeA"); 
    Element nodeB = root.getChild("nodeB"); 
    Element nodeC = root.getChild("nodeC"); 

Теперь набор слушателей

root.setStartElementListener(new StartElementListener() { 
      public void start(Attributes attributes) { 
       foundElement = true;// tells you that you are parsing the intended xml 
      } 
     }); 

    nodeA.setEndTextElementListener(new EndTextElementListener() { 
      public void end(String body) { 
       //populate your pojo 
      } 
     }); 

Таким образом, вы можете избавиться от все эти инструкции if-else и boolean, но вы должны жить w с N количеством слушателей.

+0

hmm, я учту это, теперь я пытаюсь работать с перечислениями, и код выглядит немного более читаемым :) –

Смежные вопросы