gpt4 book ai didi

java - 使用 StAx 解析 XML 文件时出错

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:13 25 4
gpt4 key购买 nike

我用 StAx 编写了一个 xml 解析器,用于解析从服务器接收的 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 的答案时,我 read 解析它。您可能知道,在 Java 中,一旦 InputStream 被 read 解析,它就会自动关闭。有时我们忘记了事情。感谢 documentation

最佳答案

严格来说,因为答案比阅读评论更容易阅读....

迪米特里的回答


我可能会找到问题的答案。问题是当我从服务器收到作为 InputStream 的答案时,我对其进行了解析。您可能知道,在 Java 中,一旦 InputStream 被解析,它就会自动关闭。有时我们忘记了事情。感谢 documentation.

答案很简单。在我的程序中,在我调用我解析的方法之前,我使用显示内容输入流来查看我接收到的内容。事实上,一旦您读取/解析您的输入流,它就会自动关闭。请参阅下面的链接。所以当我调用我的方法解析时,Inputstream 参数已经关闭,这就是我捕获此错误的原因。

关于java - 使用 StAx 解析 XML 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5976602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com