使用 StAx 解析 XML 文件时出错

Posted

技术标签:

【中文标题】使用 StAx 解析 XML 文件时出错【英文标题】:Error while parsing XML file with StAx 【发布时间】:2011-08-24 00:17:58 【问题描述】:

我用 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

【问题讨论】:

您应该用您找到的解决方案来回答您的问题。这对其他人有用。 我目前遇到了这个问题,很想看看解决方案是什么。请提供。 您好,抱歉。我有一段时间没有连接到 ***。答案很简单。在我的程序中,在调用我解析的方法之前,我使用显示内容输入 Stream 来查看我收到的内容。事实是,一旦您读取/解析您的输入流,它就会自动关闭。请参阅下面的链接。所以当我调用我的方法解析时,Inputstream 参数已经关闭,这就是我发现这个错误的原因。 @sudocode,没有正确的解决方案。我给的 javadoc 链接上的一切都很清楚 【参考方案1】:

严格来说是因为答案比通过 cmets 阅读更容易阅读......

迪米特里的回答


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

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

【讨论】:

【参考方案2】:

端点 URL 应使用 ?wsdl。例如 http://172.16.31.132:8088/mockApplicationServicesBinding?wsdl

【讨论】:

你在说什么??

以上是关于使用 StAx 解析 XML 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 xml 文件中得到“错误:解析 XML 时出错:未绑定前缀”

用jdom解析xml文件时如何解决中文问题?如何解析?

使用 stax 和 dom 读取大型 XML 文件

尝试使用 Robolectric 测试 XML 解析时出错

解析 PIG-XML 时出错

xml格式出错