11

I wrote a xml parser with StAx that I use to parse XML streams received from the server.Here is my code :

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);
                }
            }
        }
    }

I get this error on the line : 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)

I don't understand what is the problem since i use the same parser for another case and it perfectly work. Here is an example of XML streams I received from a server :

  <?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>

Can someone give some advice ?

EDIT : I may find the answer to my question. The problem was when I have received the answer from the server as InputStream, I read parse it. As you may know, in Java, once an InputStream is read parsed, it is close automatically. Things sometime we forgot. Thanks for the documentation

4
  • 1
    You should answer your question with the solution you found. This will be useful for others. Commented May 20, 2011 at 13:59
  • I am having this issue currently and would love to see what the resolution is. Please provide. Commented May 24, 2011 at 19:30
  • Hi sorry. It is been a while that I did not connect to stackoverflow. The answer is very simple. In my program, before I called the method I parse, I use to display the content input Stream to see what I am receiving. The fact is, once you read/parse your inpustream, it is automatically close. See the link below. So when I call my method parse, the Inputstream parameter was already close, this is why I caught this error. Commented May 31, 2011 at 0:17
  • @sudocode, there is no correct solution. Everything is clear on the javadoc link i gave Commented May 31, 2011 at 0:20

2 Answers 2

6

Strictly because an answer is easier to read than the reading through the comments....

Answer from Dimitri


I may find the answer to my question. The problem was when I have received the answer from the server as InputStream, I parse it. As you may know, in Java, once an InputStream is parsed, it is close automatically. Things sometime we forgot. Thanks for the documentation .

The answer is very simple. In my program, before I called the method I parse, I use to display the content input Stream to see what I am receiving. The fact is, once you read/parse your inpustream, it is automatically close. See the link below. So when I call my method parse, the Inputstream parameter was already close, this is why I caught this error.

Sign up to request clarification or add additional context in comments.

Comments

-1

endpoint URL should be with ?wsdl. For example http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl

1 Comment

What are you talking about??

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.