2013-06-20 3 views
0

У меня есть большой ответ 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); 

соответственно является ответом SOAP и fetchResult является Строка fetchResult = «// результат/текст()»;

Я получаю исключение из памяти с этим подходом. Поэтому я пытался обработать документ как поток, а не использовать весь ответ в качестве документа.

Но я не могу придумать код.

Может ли кто-нибудь из вас, пожалуйста, помочь мне?

+0

На каком языке это? C#? –

+0

Нет ... его в Java – user1356042

ответ

1

Если это на Java, вы можете попробовать использовать dom4j. Это хороший способ чтения xml с помощью выражения xpathExpression.

Дополнительно 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 работает с любым парсером SAX через JAXP. Для получения дополнительной информации см. What XML parser does dom4j use?

+0

это устранит проблему нехватки памяти.? – user1356042

+0

нет, если файл, который вы слишком разбираете, слишком велик, чтобы вписаться в память. –

+0

, то как я мог бы достичь решения здесь, кроме увеличения размера кучи ... – user1356042

1

DOM & JDOM - это многопользовательские синтаксические анализаторы API. DOM создает дерево документа XML в памяти. Вы должны использовать StAX или SAX, потому что они предлагают лучшую производительность.

+0

Да ... это то, что я пытаюсь сделать, но, к сожалению, я не смог придумать код. – user1356042

0

XPath & Классы 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); 
+0

Ammar ... спасибо за ваше решение ... но это все еще исключает из памяти – user1356042

+0

http://andreas.haufler.info/2012/01/conveniently-processing-large-xml-files.html – Ammar

+0

из ошибка памяти исчезла сейчас, но я получаю исключение в weired как [Fatal Error]: -1: -1: преждевременный конец файла. org.xml.sax.SAXParseException: преждевременный конец файла. – user1356042

Смежные вопросы