5

私; XPath を使用して、URL によって返された XML ドキュメントを解析しています。指定された入力でコードを実行すると動作しますが、ユーザー入力として入力を与えると例外がスローされます。 コード:

    class{
        private String generalQuery =  "//@*";
    method(){
        System.out.println("Enter URL");
        url = scan.nextLine();
        URL oracle = new URL(url);
        InputStream is = oracle.openStream();

        org.w3c.dom.Document doc = null;
        DocumentBuilderFactory domFactory;
        DocumentBuilder builder;

        try {
            domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setNamespaceAware(true);
            builder = domFactory.newDocumentBuilder();
            doc = builder.parse(is);
        } catch (Exception ex) {
            System.err.println("unable to load XML: " + ex);
        }

    Map <String, String> params = new HashMap<String, String> ();

            XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();
            xpath.setNamespaceContext(new NameSpaces(doc));
            XPathExpression expr = xpath.compile(generalQuery);
            Object result = expr.evaluate(doc, XPathConstants.NODESET); // exception thrown here

            NodeList nl = (NodeList) result;

            for (int i = 0 ; i < nl.getLength() ; i++){
                Node n = (Node)nl.item(i);
                params.put(n.getNodeName(), n.getNodeValue());
            }

            return params;
}
}

例外:

javax.xml.transform.TransformerException: Unable to evaluate expression using this context

クラス NameSpaces :

import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import org.w3c.dom.Document;

public class NameSpaces implements NamespaceContext {
    private Document sourceDocument;

    public NameSpaces(Document document) {
        sourceDocument = document;
    }

    @Override
    public String getNamespaceURI(String prefix) {
        if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
            return sourceDocument.lookupNamespaceURI(null);
        } else {
            return sourceDocument.lookupNamespaceURI(prefix);
        }
    }

    @Override
    public String getPrefix(String namespaceURI) {
        return sourceDocument.lookupPrefix(namespaceURI);
    }

    @Override
    public Iterator<String> getPrefixes(String namespaceURI) {
        return null;
    }
}
4

3 に答える 3

10

nullXPath 式を評価しようとすると、ドキュメントから「このコンテキストを使用して式を評価できません」という例外が発生する場合もあります。(同じエラーが発生し、ドキュメントを適切に初期化していないことを理解するのに時間がかかりました)。

あなたのコードでは

try {
  // load document
}
catch (Exception ex) {
  System.err.println("unable to load XML: " + ex);
}

// happily continue

これはトラブルの呼び出しです。初期化中に例外が発生した場合は、その場で停止し、続行しないでください。エラーの処理方法がまったくわからない場合は、 を使用してくださいcatch(Exception e) { throw new Error(e); }。これにより、例外が発生し、スタック トレースを出力して終了するデフォルトの例外ハンドラによって処理されることが期待されます。

あなたの質問の読者として、私は例外がスローされた場所さえ知りません。この情報を提供する必要があります。someException.printStackTrace();を使用して、正しい行を指すスタック トレースを取得することもできることに注意してください。

于 2014-02-13T12:12:05.080 に答える