我有一个大型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()”;
这种方法我的内存异常。所以我试图将文档作为流处理,而不是将整个响应作为文档使用。
但我无法提出代码。
你们中的任何人可以帮助我吗?
答案 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);