0

処理してデータベースに保存したい大きな SOAP 応答があります。以下のように全体を Document として処理しようとしています

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setCoalescing(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream is = new ByteArrayInputStream(resp.getBytes());
Document doc = db.parse(is);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile(fetchResult);
String result = (String) expr.evaluate(doc, XPathConstants.STRING);

resp は SOAP 応答で、fetchResult は String fetchResult = "//result/text()"; です。

このアプローチでは、メモリ例外が発生しています。そのため、応答全体をドキュメントとして消費するのではなく、ドキュメントをストリームとして処理しようとしていました。

しかし、私はコードを思い付くことができません。

どなたか助けていただけませんか?

4

3 に答える 3

1

これが Java の場合、dom4jを使用してみてください。これには、xpathExpression を使用して xml を読み取る優れた方法があります。

さらに、dom4j は、XML ドキュメントを処理するためのイベント ベースのモデルを提供します。このイベント ベースのモデルを使用すると、ドキュメントの一部が正常に処理されたときに XML ツリーをプルーニングできるため、ドキュメント全体をメモリに保持する必要がなくなります。

データベース プロセスによって外部で生成され、次のような非常に大きな XML ファイルを処理する必要があるとします (N は非常に大きな数字です)。

<ROWSET>
    <ROW id="1">
        ...
    </ROW>
    <ROW id="2">
        ...
    </ROW>
    ...
    <ROW id="N">
        ...
    </ROW>
</ROWSET>

したがって、それぞれ<ROW>を個別に処理するには、次のことができます。

// enable pruning mode to call me back as each ROW is complete
SAXReader reader = new SAXReader();
reader.addHandler( "/ROWSET/ROW", 
    new ElementHandler() {
        public void onStart(ElementPath path) {
            // do nothing here...    
        }
        public void onEnd(ElementPath path) {
            // process a ROW element
            Element row = path.getCurrent();
            Element rowSet = row.getParent();
            Document document = row.getDocument();
            ...
            // prune the tree
            row.detach();
        }
    }
);

Document document = reader.read(url);

// The document will now be complete but all the ROW elements
// will have been pruned.
// We may want to do some final processing now
...

dom4j が非常に大きな XML ドキュメントを処理する方法を参照してください。それがどのように機能するかを理解するために。


さらに、dom4j は JAXP を介して任意の SAX パーサーと連携します。詳細については、 dom4j が使用する XML パーサーを参照してください。

于 2013-06-20T08:11:58.230 に答える