0

次の問題があります。

XML SAXParser を使用して xml ファイルを解析し、クラスを動的に作成してそのプロパティを設定しています。

4 つのクラスを作成し、クラスのプロパティを設定するコードを作成しましたが、問題は、コードが 1 つの大きな条件付きケース (if/else if/else) であり、非常に読みにくいことです。

15 の異なるクラスを作成できるように xml を解析したいので、コードが非常に大きくなります。

正確な問題は、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);

}

}

4

1 に答える 1

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 ステートメントとブール値をなくすことができますが、N 個のリスナーと一緒に暮らす必要があります。

于 2013-03-07T13:39:46.860 に答える