1

これから説明するクラスは、Java で XPath を介して XML ドキュメントを解析する従来の方法です。

public class Main {

    private Document createXMLDocument(String fileName) throws Exception {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(fileName);

        return doc;
    }

    private NodeList readXMLNodes(Document doc, String xpathExpression) throws Exception {
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile(xpathExpression);

        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;

        return nodes;
    }

    public static void main(String[] args) throws Exception {
        Main m = new Main();
        Document doc = m.createXMLDocument("tv.xml");
        NodeList nodes = m.readXMLNodes(doc, "//serie/eason/@id");
        int n = nodes.getLength();

        Map<Integer, List<String>> series = new HashMap<Integer, List<String>>();

        for (int i = 1; i <= n; i++) {
            nodes = m.readXMLNodes(doc, "//serie/eason[@id='" + i + "']/episode/text()");
            List<String> episodes = new ArrayList<String>();
            for (int j = 0; j < nodes.getLength(); j++) {
                episodes.add(nodes.item(j).getNodeValue());
            }
            series.put(i, episodes);
        }

        for (Map.Entry<Integer, List<String>> entry : series.entrySet()) {
            System.out.println("Season: " + entry.getKey());
            for (String ep : entry.getValue()) {
                System.out.println("Episodio: " + ep);
            }
            System.out.println("+------------------------------------+");
        }
    }
}

そこには、巨大なxmlファイルの場合に心配するいくつかの方法があります。の使用のように

Document doc = builder.parse(fileName);

return doc;

また

  Object result = expr.evaluate(doc, XPathConstants.NODESET);
  NodeList nodes = (NodeList) result;

  return nodes;

私が処理する必要があるxmlドキュメントは顧客によって作成され、内部には基本的に電子メールとその内容を説明する無限の数のレコードがあるため、私は心配しています(すべてのユーザーは独自の個人的な電子メールを持っているため、そこにはたくさんのhtmlがあります). これが最も賢明なアプローチではないことは承知していますが、可能性の 1 つであり、私がここに来る前にすでに稼働していました。

私の質問は、xpath を使用して巨大な xml ファイルを処理parseするにはどうすればよいですか?evaluate

4

2 に答える 2

3

まず、XPath は XML を解析しません。createXMLDocument() メソッドがそれを行い、解析された XML のツリー表現を出力として生成します。次に、XPath を使用してツリー表現を検索します。

あなたが本当に探しているのは、解析中に XML をオンザフライで検索するものです。

これを行う 1 つの方法は、「ドキュメント プロジェクション」を実装する XQuery システム (Saxon-EE など) を使用することです。これにより、クエリが分析され、ドキュメントのどの部分が必要かがわかり、ドキュメントを解析すると、実際に必要なドキュメントの部分のみを含むツリーが構築されます。

ただし、クエリが例のように単純な場合は、それを SAX アプリケーションとしてコーディングすることはそれほど難しくありません。このアプリケーションでは、startElement や endElement などのイベントが XML パーサーによってアプリケーションに通知されます。メモリ内のツリー。

于 2012-04-22T17:10:10.777 に答える
3

StAX パーサーを使用できます。DOM オプションよりも少ないメモリで済みます。StAX の優れた入門書は、http: //tutorials.jenkov.com/java-xml/stax.html にあります。

于 2012-04-22T17:07:16.870 に答える