1

XML を解析するクラスを作成したいと考えています。これが私のコードです:

public class ParserXML {

private String Flux;
private ArrayList<String> EvaluateExpr = new ArrayList<String>();
private ArrayList<String> Result  = new ArrayList<String>();

public ParserXML(String url, ArrayList<String> exp) {
    this.Flux = url;
    this.EvaluateExpr = exp;

    this.loadXmlFlux();
}

private void loadXmlFlux() {

    HttpClient httpclient = null;

    try {
        httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(this.Flux);

        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = httpclient.execute(httpget, responseHandler);

        InputSource docXml = new InputSource(new StringReader(responseBody)); 

        XPathFactory xpathFactory = XPathFactory.newInstance();

        XPath xpath = xpathFactory.newXPath();

        ArrayList<String> result = new ArrayList<String>();

        /*
         * Looping on all expression to evaluate
         */
        for (String i : this.EvaluateExpr) {
            try {
                result.add(xpath.evaluate(i, docXml));
            } catch (XPathExpressionException e) {
                e.printStackTrace();
            }

        }

        this.Result = result;

    } catch (HttpResponseException ex) {        
        ex.printStackTrace();
    }
    catch (IOException ex) {
       ex.printStackTrace();
    }   
    finally{
        if(httpclient!=null) {
            httpclient.getConnectionManager().shutdown();
        }
    }
}

public ArrayList<String> getResult() {
    return this.Result;
}

}

このクラスは、評価する式が 1 つしかない場合に正常に機能します。しかし、XML ストリームで 2 つの式を評価したい場合、エラーが発生します。

java.io.IOException: com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load の java.io.StringReader.read(不明なソース) で java.io.StringReader.ensureOpen(不明なソース) でストリームが閉じられました(不明なソース) com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity (不明なソース) com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString (不明なソース) com .sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion (不明なソース) com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (不明なソース) com.sun.org.apache .xerces.internal.parsers.XML11Configuration.parse (不明なソース) com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (不明なソース) com.sun.org.apache.xerces.internal.parsers で.DOMParser。parse(未知のソース) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知のソース) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(未知のソース) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(不明なソース) の Common.ParserXML.loadXmlFlux(ParserXML.java:56) の Common.ParserXML.(ParserXML.java:29) の Domaine.Ahref .loadReferringDomains(Ahref.java:46) で Domaine.Ahref.(Ahref.java:19) で MainApp.checkAhrefs(MainApp.java:199) で MainApp.main(MainApp.java:67) ------- -------- リンク先 ------------------ com.sun.org.apache.xpath.internal.jaxp の javax.xml.xpath.XPathExpressionException。 XPathImpl.evaluate (不明なソース) com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate (不明なソース) at Common.ParserXML。loadXmlFlux(ParserXML.java:56) で Common.ParserXML.(ParserXML.java:29) で Domaine.Ahref.loadReferringDomains(Ahref.java:46) で Domaine.Ahref.(Ahref.java:19) で MainApp.checkAhrefs( MainApp.java:199) で MainApp.main(MainApp.java:67) 原因: java.io.IOException: java.io.StringReader.ensureOpen(不明なソース) で java.io.StringReader.read(Unknownソース) com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load (不明なソース) com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity (不明なソース) com.sun .org.apache.xerces.internal.impl.XMLEntityScanner.skipString (不明なソース) com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion (不明なソース) com.sun.org.apache.xerces で.internal.parsers。com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (不明なソース) の XML11Configuration.parse (不明なソース) com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (不明なソース) ) com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(不明なソース) com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(不明なソース)

ループで「xpath.evaluate(i, docXml)」を再度使用できない理由がわかりません。

ありがとう

4

1 に答える 1

4

InputSource同じものを2回使用しています。その後InputSource、入力を1回読み取った後、入力が使い果たされます。

最も簡単なアプローチは、おそらく、InputSource反復ごとに新しいものを作成し、毎回新しいものを作成するStringReaderことです。基本的にこの行を移動します:

InputSource docXml = new InputSource(new StringReader(responseBody)); 

ループに。

あるいは、解析されたDOM表現(たとえばDocument)に対してXPath式を評価する方法があるはずですが、関連する魔法の呪文を知るのに十分なJavaXML作業を最近行っていません。ただし、これにより、式ごとにXMLを再解析する必要がなくなります。これは明らかに便利です。

于 2012-08-23T08:33:19.310 に答える