如何解析大型SOAP响应

时间:2013-06-20 08:08:29

标签: java soap

我有一个大型SOAP响应,我想在数据库中处理和存储。我正在尝试按照下面的文档处理整个事情

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()”;

这种方法我的内存异常。所以我试图将文档作为流处理,而不是将整个响应作为文档使用。

但我无法提出代码。

你们中的任何人可以帮助我吗?

3 个答案:

答案 0 :(得分: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
...

请参阅How dom4j handle very large XML documents?了解其工作原理。


此外,dom4j可以通过JAXP与任何SAX解析器一起使用。 有关详细信息,请参阅What XML parser does dom4j use?

答案 1 :(得分:1)

DOM&amp; JDOM是消耗内存的解析API。 DOM在内存中创建XML文档的树。您应该使用StAX或SAX,因为它们可以提供更好的性能。

答案 2 :(得分:0)

XPath&amp; XPathExpression类具有接受InputSource参数的方法。

InputStream input = ...;
InputSource source = new InputSource(input);

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("...");
String result = (String) expr.evaluate(source, XPathConstants.STRING);