【问题标题】:Java parsing XML document gives “Content not allowed in prolog” errorJava 解析 XML 文档给出“Prolog 中不允许的内容”错误
【发布时间】:2015-11-15 17:08:40
【问题描述】:

我正在尝试在 Java 中运行一个程序,该程序采用自定义 XML 文件并对其进行解析。我正在使用 XML 文件进行存储。我在错误日志中收到以下错误。

 WARN - OtherFault:
javax.xml.bind.UnmarshalException: Content is not allowed in prolog.
 - with linked exception:
[org.xml.sax.SAXParseException: Content is not allowed in prolog.]
        at com.wsc.cca.ns20100530.fault.xml.impl.runtime.SAXUnmarshallerHandlerImpl.handleEvent(Unknown Source)
        at com.wsc.cca.ns20100530.fault.xml.impl.runtime.ErrorHandlerAdaptor.propagateEvent(Unknown Source)
        at com.wsc.cca.ns20100530.fault.xml.impl.runtime.ErrorHandlerAdaptor.fatalError(Unknown Source)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
     at com.wsc.cca.ns20100530.fault.xml.impl.runtime.ErrorHandlerAdaptor.fatalError(Unknown Source)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
        at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1039)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at com.wsc.cca.ns20100530.fault.xml.impl.runtime.UnmarshallerImpl.unmarshal(Unknown Source)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
        at com.cts.util.CCARetrieveThread.run(CCARetrieveThread.java:325)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)

包含 XML 文件的开头:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<retrieveResponse xmlns="urn:wsc.com/cca/2010/05/30">
    <Number>1234</Number>
    <Info>
        <ID>12</ID>
        <Status>ACTIVE</Status>
        <ClosedDate xsi:nil="true"/>
        <Info>
            <To>1</To>
            <From>2</From>
            <Date>2011-05-16-04:00</Date>
        </Info>
        <Multi>true</Multi>
        <CardExpiryDate>2012-12-03-05:00</CardExpiryDate>
    </Info>
    <PInfo>
        <PID>000005471</PID>
        <Title xsi:nil="true"/>
        <FName>TAYLOR</FName>
        <LName>NGWHIP</LName>
        <Language>en</Language>
        <PRelationship>PRIMARY</PRelationship>
        <Number>1234</Number>
        <TravelVIP xsi:nil="true"/>
        <DesignatedUser1 xsi:nil="true"/>
            <DesignatedUser2 xsi:nil="true"/>
        </PInfo>
</retrieveResponse>
</soapenv:Body></soapenv:Envelope>

程序能够读取 XML 文件。我得到上面的错误。 这是一个代码sn-p:

if (pAWSType == Constants.AWS_CASHBACK) {
    sLogger.info("Setting stub parameter for Cashback");
    File lStubFile = new File(lConfig.getString("com.CCAWS.STUB.FilePath")+"CCBResponse-"+pAcctNum+".xml");
    if (!lStubFile.exists()) {
        mRetrieveThread = new CCARetrieveThread(new File(lConfig.getString("com.CCAWS.STUB.FilePath")+"CCBResponse.xml"));      
    } else {
        mRetrieveThread = new CCARetrieveThread(lStubFile);
    }
} else {
    sLogger.info("Setting stub parameter for Travel Points");
    File lStubFile = new File(lConfig.getString("com.CCAWS.STUB.FilePath")+"CCAResponse-"+pAcctNum+".xml");
    if (!lStubFile.exists()) {
        mRetrieveThread = new CCARetrieveThread(new File(lConfig.getString("com.CCAWS.STUB.FilePath")+"CCAResponse.xml"));      
    } else {
        mRetrieveThread = new CCARetrieveThread(lStubFile);
    }
}

在我看来,我的 XML 文件的序言中没有无效内容。我不知道出了什么问题。请帮忙。谢谢。

【问题讨论】:

    标签: java xml eclipse xml-parsing


    【解决方案1】:

    这通常意味着您在 xml 文件的开头有一些隐藏字符。

    尝试使用编辑器打开它并查看所有字符并确保没有隐藏字符。

    【讨论】:

    • 使用Notepad++ 更容易:打开文件,将编码更改为“UTF-8 without BOM”。 (编码 -> 转换为没有 BOM 的 UTF-8)。 BOM 通常是罪魁祸首。否则,可以尝试PSPad
    【解决方案2】:

    此错误通常意味着您尝试解析的内容为空或格式不正确的 XML。

    在您的情况下,您的一些结束标签似乎丢失了。 &lt;/retrieveResponse&gt;&lt;/soapenv:Body&gt; 这样的结束标签在哪里?

    【讨论】:

    • 这只是一个大 XML 的 sn-p。但我添加了这些标签只是为了让其他人不会感到困惑。
    猜你喜欢
    • 2011-02-05
    • 2011-10-23
    • 2016-11-28
    • 2011-06-19
    • 1970-01-01
    • 2022-12-10
    • 2023-04-06
    • 2015-12-15
    • 1970-01-01
    相关资源
    最近更新 更多