解析XML时prolog中出现意外的EOF

时间:2016-10-18 12:22:53

标签: java xml soap

我有这个XML文档,它是SOAP请求的主体:

<?xml version="1.0" encoding="UTF-8"?>
<mes:SubmitStructureRequest xmlns:mes="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" xmlns:str="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/structure" xmlns:reg="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/registry" xmlns:web="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/webservices">
            <mes:Header>
               <mes:ID>TEST_DFD</mes:ID>
               <mes:Test>true</mes:Test>
               <mes:Prepared>2013-10-10</mes:Prepared>
               <mes:Sender id="TESTER"/>
               <mes:Receiver id="ESTAT"/>
            </mes:Header>
            <mes:SubmitStructureRequest action="Append">
               <str:Structures>
                  <str:Dataflows>
                     <str:Dataflow agencyID="ESTAT" id="DFD_TEST_21" version="1.0">
                        <com:Name xml:lang="en">Production in construction, total, building construction, civil engineering (Monthly)</com:Name>
                        <str:Structure>
                           <Ref agencyID="ESTAT" class="DataStructure" id="STS" package="datastructure" version="2.0"/>
                        </str:Structure>
                     </str:Dataflow>
                  </str:Dataflows>
               </str:Structures>
            </mes:SubmitStructureRequest>
</mes:SubmitStructureRequest>

我正在尝试使用这段Java代码解析它(该流是前面提到的xml):

InputStream stream = sourceData.getInputStream();
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader parser = factory.createXMLStreamReader(stream);
            while (parser.hasNext()) {
                int event = parser.next();
                if (event == XMLStreamConstants.START_ELEMENT) {
                    for(int i = 0 ; i < parser.getNamespaceCount(); i ++) {
                        String ns = parser.getNamespaceURI(i);
                        if(SdmxConstants.getNamespacesV1().contains(ns)) {
                            return SDMX_SCHEMA.VERSION_ONE;
                        }
                        if(SdmxConstants.getNamespacesV2().contains(ns)) {
                            return SDMX_SCHEMA.VERSION_TWO;
                        }
                        if(SdmxConstants.getNamespacesV2_1().contains(ns)) {
                            return SDMX_SCHEMA.VERSION_TWO_POINT_ONE;
                        }
                    }
                    throw new SdmxSyntaxException("Can not get Scheme Version from SDMX message.  Unable to determine structure type from Namespaces- please ensure this is a valid SDMX document");
                }
            }
            throw new SdmxSyntaxException(ExceptionCode.XML_PARSE_EXCEPTION, "No root node found");
        } catch(XMLStreamException e) {
            throw new SdmxSyntaxException(ExceptionCode.XML_PARSE_EXCEPTION, e);
        } finally {
            if(stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }

int event = parser.next();我得到了:

  

com.ctc.wstx.exc.WstxEOFException:prolog中意外的EOF

任何想法为什么会发生这种情况?

4 个答案:

答案 0 :(得分:2)

证据表明您实际上已尝试解析空流。

它说在尝试解析序言时发现了EOF。您向我们展示的XML中的序言没有任何问题,特别是解析器遇到EOF没有合理的理由。因此,我推断您向我们展示的XML并不是解析器实际看到的内容。

答案 1 :(得分:1)

这个确切的错误很难复制,我知道我花了很长时间 尝试获取此确切的错误消息。

空流不会引发此异常。获取此特定异常的方法如下:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
InputStream stream = new ByteArrayInputStream(bos.toByteArray());
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader parser = factory.createXMLStreamReader(stream);
            while (parser.hasNext()) {
               int event = parser.next();
               //Exception is thrown
            }

如果像我一样,您尝试通过使用新的byte [0]构造ByteArrayInputStream或读取一个空文件来尝试重新创建它,那么您将得到此异常。

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Premature end of file

答案 2 :(得分:0)

尝试在开始解析流之前重置流。例如,如果您先验证文档,然后在不重置流的情况下对其进行分析,则可能会发生此异常。

在创建解析器之前,在代码中插入行stream.reset();

答案 3 :(得分:0)

这个错误的原因是多方面的,很难确定一个,基本上这个错误最常见的因素是你发送的xml请求或者应该返回给你的xml响应是不是xml格式,因此无法解析,请尝试在soap ui中执行请求,这将有助于以更好的方式缩小错误范围。