0

以下の個別の .java ファイルを使用して、SAX パーサーの設計実装について説明します。

パーサー.java

public static void main(String[] args){
   Parser myParser = new Parser();
   Parser.parseXML(inputFile);  //may not be correct call, 
                             //but using it to make things clear to understand
}


public void parseXML(File inputFile) {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
        SAXParser   parser = factory.newSAXParser(); 
        SaxHandler handler = new SaxHandler();
        parser.parse(inputFile, handler);
    } ....
}

SaxHandler.java

public class SaxHandler extends DefaultHandler {

public void startElement(String uri, String localName, 
                         String qName, Attributes attributes) throws SAXException{
    MyClass mine = new MyClass();
    return mine.returnString;  // I would like to have this line so that I can return               
                              //"Hello" ultimately to the main method
}

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

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

MyClass.java

public String returnString()
{
    return "Hello";
}

コメントで述べたように、メイン メソッドで文字列 "Hello" を取得できるように、方法を見つけるか、実装を変更したいと考えています。上記の実装では、SAXHandler の startELement および endELement メソッドの戻り値の型に問題があります。目的の結果を達成できるようにするための回避策や設計変更はありますか? 私の質問が明確であることを願っています。

ありがとう

4

2 に答える 2

1

その背後にあるより一般的な問題は、パーサーが読み取っているものからデータ構造を構築するにはどうすればよいかということです。

あなたの場合、SaxHandler のプライベート フィールドにデータ (つまり "Hello") を格納できます。さらに、getter を追加します。つまりString getData()、SaxHandler に追加します。メソッド parseXml は、次で終了できます。

  return handler.getData();
于 2013-11-06T22:23:10.217 に答える
0

SaxHandler のコンストラクターで、Parser オブジェクトへの参照を取得し、目的の文字列を処理する Parser の目的のメソッドを呼び出すことができます。

途中で戻るのstartElementは正しくありません。解析プロセス全体が停止するからです。したがって、DefaultHandler のすべてのメソッドはvoid.

于 2013-11-06T22:29:50.940 に答える