2015-12-30 6 views
0

Я написал следующий код для сообщения SOAP SOAP с использованием STAX. Я получаю исключение нулевого указателя в xmlStreamReader.hasNext(). Пожалуйста помоги.Прослушать SOAP-сообщение с использованием STAX

Source src = soapMsg.getSOAPPart().getContent(); 
    ... 
    HorizonHeaderData header = parser.parseHorizonHeader(src); 
    ... 
    public HorizonHeaderData parseHorizonHeader(Source src) { 
    HorizonHeaderData header = new HorizonHeaderData(); 
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
    if (null != src) { 

     try { 
      XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(src); 


      if(xmlStreamReader==null){ 
       System.out.println("xmlStreamReader is null"); 
      } 

      while(xmlStreamReader.hasNext()){ 
       int event = xmlStreamReader.getEventType(); 
       switch(event){ 
       case XMLStreamConstants.START_ELEMENT: 
         System.out.println("Element: "+ xmlStreamReader.getLocalName() + "\nValue: "+ xmlStreamReader.getElementText()); 
       } 

       xmlStreamReader.next(); 

Входной XML является

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bpel="http://xmlns.oracle.com/TestLoggingComposite/SSNService/BPELProcess2"> 
 
    <soapenv:Header> 
 
    <oas:Security soapenv:mustUnderstand="0" xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soap="soap" xmlns:xsi="xsi"> 
 
     <wsu:SecurityContextToken xmlns:wsu="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"> 
 
      <wsu:Identifier>${=java.util.UUID.randomUUID()}</wsu:Identifier> 
 
     </wsu:SecurityContextToken> 
 
     </oas:Security> 
 
    </soapenv:Header> 
 
    <soapenv:Body/> 
 
</soapenv:Envelope> \t

Я могу увидеть значения с помощью DOM, но есть исключение, используя Stax. Незлая помощь.

+0

почему саксофон? это печально известная плохая модель обработки, сложная в использовании, длинный утомительный код ... –

+0

Нам нужно было обработать заголовки самым быстрым способом. – Sharat

+0

Можете ли вы изменить свой вопрос, чтобы включить описание вашей логики приложения? IE. что ваш код пытается выполнить, я могу затем представить что-то для вас, чтобы рассмотреть ... –

ответ

0

Ниже приведен код, чтобы сделать это с помощью VTD-XML ... это современное состояние по сравнению с SAX, DOM или Pull ... для сверхмощной обработки это не имеет себе равных ... вот недавнее исследование документ, озаглавленный "Обработка XML с Java - тест производительности" для вашего развлечения ...

http://sdiwc.net/digital-library/request.php?article=0d947fb50e2f0160a75ac9f6bbf0818a

import com.ximpleware.*; 
import java.io.*; 
public class ExtractSOAPHeader { 
    public static void main(String[] s) throws VTDException, FileNotFoundException,IOException{ 
     VTDGen vg = new VTDGen(); 
     vg.selectLcDepth(5);// enable better random access performance 
     if (!vg.parseFile("d:\\xml\\soapheader.xml", true)) 
      return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.declareXPathNameSpace("wsu", 
       "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"); 
     ap.declareXPathNameSpace("soapenv", 
       "http://schemas.xmlsoap.org/soap/envelope/"); 
     ap.declareXPathNameSpace("oas", 
       "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
     // compile XPath expression might be expensive, try to take it out of any loop and in any warmer-up section of the code 
     ap.selectXPath("/soapenv:Envelope/soapenv:Header/oas:Security/wsu:SecurityContextToken/wsu:Identifier/text()"); 
     int i= ap.evalXPath(); 
     if (i!=-1) 
      System.out.println(" the text node ==>"+vn.toString(i)+ " "+i); 
    } 

}