Ошибка при разборе XML-файла с помощью StAx

Я написал синтаксический анализатор xml с помощью StAx, который я использую для анализа потоков XML, полученных с сервера. Вот мой код:

private Map<String, IUnitaryAction> parse(InputStream is) throws XMLStreamException {

    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLStreamReader reader = factory.createXMLStreamReader(is);
    boolean action = false;
    Map<String, IUnitaryAction> actionsMap = new HashMap<String, IUnitaryAction>();

    while(reader.hasNext()){
        int type = reader.next();
        switch(type){
        case XMLStreamReader.START_ELEMENT :
            action = reader.getLocalName().equals("action-description");
            break;

        case XMLStreamReader.CHARACTERS :
            if( action ){
                String act = reader.getText();
                System.out.println("Action trouvées " + act);

                String[] praxiscmd = act.split("_");
                if("CREATE".equals(praxiscmd[0])){
                    Create c = new Create(praxiscmd[1], praxiscmd[2], null);
                    actionsMap.put(praxiscmd[1], c);
                } else if("DELETE".equals(praxiscmd[0])){
                    Delete d = new Delete(praxiscmd[1],praxiscmd[2], null);
                    actionsMap.put(praxiscmd[1], d);
                } else if ("ADDPROPERTY".equals(praxiscmd[0])) {
                    AddProperty ap = new AddProperty(praxiscmd[1],
                            praxiscmd[2], praxiscmd[3], null);
                    actionsMap.put(praxiscmd[1], ap);
                } else if ("ADDREFERENCE".equals(praxiscmd[0])) {
                    AddReference ar = new AddReference(praxiscmd[1],
                            praxiscmd[2], praxiscmd[3], null);
                    actionsMap.put(praxiscmd[1], ar);
                } else if ("REMPROPERTY".equals(praxiscmd[0])) {
                    RemProperty rp = new RemProperty(praxiscmd[1],
                            praxiscmd[2], praxiscmd[3], null);
                    actionsMap.put(praxiscmd[1], rp);
                } else if ("REMREFERENCE".equals(praxiscmd[0])) {
                    RemReference rr = new RemReference(praxiscmd[1],
                            praxiscmd[2], praxiscmd[3], null);
                    actionsMap.put(praxiscmd[1], rr);
                }
            }
        }
    }

Я получаю эту ошибку в строке: int type = reader.next():

 javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Premature end of file.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:584)
    at fr.lip6.graphelex.TelexImpl.parse(TelexImpl.java:147)
    at fr.lip6.graphelex.TelexImpl.sendHttpRequest(TelexImpl.java:264)
    at fr.lip6.graphelex.TelexImpl.schedules(TelexImpl.java:116)
    at fr.lip6.graphelex.MapperImpl.send(MapperImpl.java:92)
    at fr.lip6.graphelex.GraphElexAgent.executeCycle(GraphElexAgent.java:81)
    at praxis.guidance.agent.Agent.run(Agent.java:71)
    at java.lang.Thread.run(Thread.java:636)

Я не понимаю, в чем проблема, так как я использую тот же парсер для другого случая, и он отлично работает. Вот пример XML-потоков, которые я получил с сервера:

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <responses>
   <executed-commands>
      <command><name>GETLASTSCEDULES</name>
      <status-code>200</status-code>
      <description>last schedule returned</description>
      </command>
     </executed-commands>
       <schedules><schedule><schedule-id>0</schedule-id>
       <doc-id>/telexDocuments/doc.dox</doc-id>
       <actions>
         <action>
          <action-description>CREATE__8VtAMXv4EeCwaM2v2VqUyg_Model</action-description>  
         <action-id>/telexDocuments/doc.dox:Peer#server2:hephaistos:0:15</action-id>
        </action>
      </actions>
      <non-actions/></schedule></schedules>
      <get-constraints/>
</responses>

Может кто-нибудь дать совет?

EDIT: я могу найти ответ на свой вопрос. Проблема заключалась в том, что когда я получил ответ от сервера как InputStream, я прочитал его разобрал. Как вы, возможно, знаете, в Java после парсинга InputStream read он автоматически закрывается. Вещи когда-то мы забыли. Спасибо за документацию.


person Dimitri    schedule 12.05.2011    source источник
comment
Вы должны ответить на свой вопрос с решением, которое вы нашли. Это будет полезно для других.   -  person sudocode    schedule 20.05.2011
comment
В настоящее время у меня есть эта проблема, и я хотел бы увидеть, каково ее решение. Пожалуйста предоставьте.   -  person cmutt78    schedule 24.05.2011
comment
Привет извините. Давненько я не подключался к stackoverflow. Ответ очень простой. В моей программе, прежде чем вызывать метод, который я анализирую, я использую его для отображения потока ввода контента, чтобы увидеть, что я получаю. Дело в том, что как только вы читаете/анализируете свой входной поток, он автоматически закрывается. См. ссылку ниже. Поэтому, когда я вызываю свой метод parse, параметр Inputstream уже был закрыт, поэтому я поймал эту ошибку.   -  person Dimitri    schedule 31.05.2011
comment
@sudocode, правильного решения нет. Все ясно по ссылке на javadoc, которую я дал   -  person Dimitri    schedule 31.05.2011


Ответы (2)


Строго потому, что ответ легче читать, чем читать комментарии....

Ответ от Дмитрий


Может быть, я найду ответ на свой вопрос. Проблема заключалась в том, что когда я получил ответ от сервера как InputStream, я его разбираю. Как вы, возможно, знаете, в Java после разбора InputStream он автоматически закрывается. Вещи когда-то мы забыли. Спасибо за документацию .

Ответ очень простой. В моей программе, прежде чем вызывать метод, который я анализирую, я использую его для отображения потока ввода контента, чтобы увидеть, что я получаю. Дело в том, что как только вы читаете/анализируете свой входной поток, он автоматически закрывается. См. ссылку ниже. Поэтому, когда я вызываю свой метод parse, параметр Inputstream уже был закрыт, поэтому я поймал эту ошибку.

person joekarl    schedule 08.06.2011

URL конечной точки должен быть с ?wsdl. Например, http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl

person vinoth    schedule 30.07.2016
comment
О чем ты говоришь?? - person svichkar; 04.11.2016