#java #xml #stax
#java #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>
Может кто-нибудь дать какой-нибудь совет?
РЕДАКТИРОВАТЬ: возможно, я найду ответ на свой вопрос. Проблема заключалась в том, что когда я получил ответ от сервера в виде InputStream, я Читать проанализируйте его. Как вы, возможно, знаете, в Java, как только входной поток Читать после разбора он закрывается автоматически. Вещи, о которых мы когда-то забывали. Спасибо за документацию
Комментарии:
1. Вы должны ответить на свой вопрос с помощью найденного вами решения. Это будет полезно для других.
2. В настоящее время у меня возникла эта проблема, и я хотел бы посмотреть, каково ее разрешение. Пожалуйста, предоставьте.
3. Привет, извините. Прошло некоторое время, что я не подключался к stackoverflow. Ответ очень прост. В моей программе, прежде чем я вызвал метод, который я анализирую, я использую для отображения потока ввода содержимого, чтобы увидеть, что я получаю. Дело в том, что как только вы прочитаете / проанализируете свой inpustream, он автоматически закроется. Смотрите ссылку ниже. Итак, когда я вызываю свой метод parse, параметр Inputstream уже был закрыт, вот почему я обнаружил эту ошибку.
4. @sudocode, правильного решения нет. Все понятно по ссылке javadoc, которую я дал
Ответ №1:
Строго потому, что ответ легче прочитать, чем чтение комментариев….
Ответ от Dimitri
Возможно, я найду ответ на свой вопрос. Проблема заключалась в том, что когда я получил ответ от сервера в виде InputStream, я его проанализировал. Как вы, возможно, знаете, в Java, как только InputStream проанализирован, он автоматически закрывается. Вещи, о которых мы когда-то забывали. Спасибо за документацию.
Ответ очень прост. В моей программе, прежде чем я вызвал метод, который я анализирую, я использую для отображения потока ввода содержимого, чтобы увидеть, что я получаю. Дело в том, что как только вы прочитаете / проанализируете свой inpustream, он автоматически закроется. Смотрите ссылку ниже. Итак, когда я вызываю свой метод parse, параметр Inputstream уже был закрыт, вот почему я обнаружил эту ошибку.
Ответ №2:
URL конечной точки должен быть с ?wsdl. Например http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl
Комментарии:
1. О чем ты говоришь??