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
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.
endpoint URL should be with ?wsdl. For example http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl
来源:https://stackoverflow.com/questions/5976602/error-while-parsing-xml-file-with-stax