问题描述
我用StAx编写了一个xml解析器,用于解析从服务器收到的XML流。这是我的代码:
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收到此错误: 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流的示例:
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 ?
编辑:
我可以找到问题的答案。问题是当我从服务器收到答案作为InputStream时,我解析它。您可能知道,在Java中,一旦InputStream被解析,它就会自动关闭。有时我们忘记的事情。感谢
EDIT :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
推荐答案
严格来说,因为答案比通过评论阅读更容易阅读....
Strictly because an answer is easier to read than the reading through the comments....
来自Dimitri的回答
Answer from Dimitri
我可以找到问题的答案。问题是当我从服务器收到答案作为InputStream时,我解析它。您可能知道,在Java中,一旦解析了InputStream,它就会自动关闭。有时我们忘记的事情。感谢
。
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.
答案非常简单。在我的程序中,在我调用我解析的方法之前,我用来显示内容输入Stream以查看我收到的内容。事实是,一旦你阅读/解析你的inpustream,它就会自动关闭。请参阅以下链接。因此,当我调用我的方法解析时,Inputstream参数已经关闭,这就是我捕获此错误的原因。
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.
这篇关于使用StAx解析XML文件时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!