简体   繁体   English

使用StAx解析XML文件时出错

[英]Error while parsing XML file with StAx

I wrote a xml parser with StAx that I use to parse XML streams received from the server.Here is my code : 我用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);
                }
            }
        }
    }

I get this error on the line : int type = reader.next() : 我在行上得到这个错误: 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流的示例:

  <?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. 问题是当我从服务器收到答案作为InputStream时,我 读了 解析它。 As you may know, in Java, once an InputStream is read parsed, it is close automatically. 您可能知道,在Java中,一旦 读取 了InputStream,它就会自动关闭。 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. 问题是当我从服务器收到答案作为InputStream时,我解析它。 As you may know, in Java, once an InputStream is parsed, it is close automatically. 您可能知道,在Java中,一旦解析了InputStream,它就会自动关闭。 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. 在我的程序中,在我调用我解析的方法之前,我用来显示内容输入Stream以查看我收到的内容。 The fact is, once you read/parse your inpustream, it is automatically close. 事实是,一旦你读取/解析你的inpustream,它就会自动关闭。 See the link below. 请参阅以下链接。 So when I call my method parse, the Inputstream parameter was already close, this is why I caught this error. 因此,当我调用我的方法解析时,Inputstream参数已经关闭,这就是我捕获此错误的原因。

endpoint URL should be with ?wsdl. 端点URL应该与?wsdl一起使用。 For example http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl 例如http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM