首页 文章

org.xml.sax.SAXParseException:prolog中不允许使用内容

提问于
浏览
137

我有一个基于Java的Web服务客户端连接到Java Web服务(在Axis1框架上实现) .

我在日志文件中遇到以下异常:

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)

27 回答

  • 3

    尝试使用freemarker解析XML文档时,我遇到了同样的问题(并解决了它) .

    我在XML文件的 Headers 之前没有空格 .

    当且仅当文件编码和XML编码属性不同时,才会出现此问题 . (例如:头文件中带有UTF-16属性的UTF-8文件) .

    所以我有两种解决问题的方法:

    • 更改文件本身的编码

    • 将 Headers UTF-16更改为UTF-8

  • 0

    我也是如此

    XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

    ,当我的应用程序为RestFull Webservice调用创建XML响应时 . 在创建XML格式字符串时,我将&lt和&gt替换为<和>,然后错误消失,我得到了正确的响应 . 不知道它是如何工作但它的工作原理 .

    sample

    String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
                +sum
                +"</ns:return></ns:addNumbersResponse>";
    
  • 6

    这通常是由XML声明之前的空格引起的,但它可能是 any text ,就像破折号或任何字符一样 . 我说经常是由白色空间引起的,因为人们认为白色空间总是可以忽略不计,但事实并非如此 .


    经常发生的另一件事是 UTF-8 BOM (字节顺序标记),如果将文档作为字符流传递给XML解析器而不是字节流,则可以将XML声明视为空格之前允许这样做 .

    如果使用模式文件(.xsd)来验证xml文件,并且其中一个模式文件具有 UTF-8 BOM ,则会发生同样的情况 .

  • 3

    实际上除了Yuriy Zubarev的帖子

    将不存在的xml文件传递给解析器时 . 例如,你通过

    new File("C:/temp/abc")
    

    当您的文件系统上只存在C:/temp/abc.xml文件时

    在任一情况下

    builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    document = builder.parse(new File("C:/temp/abc"));
    

    要么

    DOMParser parser = new DOMParser();
    parser.parse("file:C:/temp/abc");
    

    所有都给出相同的错误信息 .

    非常令人失望的bug,因为下面的痕迹

    javax.servlet.ServletException
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    ...
    Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    ... 40 more
    

    没有说'文件名不正确'或'这样的文件不存在'的事实 . 在我的情况下,我有绝对正确的xml文件,不得不花了2天来确定真正的问题 .

  • 0

    尝试在prolog中的 encoding="UTF-8" 字符串和终止 ?> 之间添加一个空格 . 在XML中,prolog在文档的开头指定这个括号 - 问号分隔元素(而stackoverflow中的标记prolog指的是编程语言) .

    Added: 那个破折号是在文档的prolog部分前面吗?那将是那里的错误,在序言前面有数据, -<?xml version="1.0" encoding="UTF-8"?> .

  • 0

    这意味着XML格式错误或响应正文根本不是XML文档 .

  • 1

    花了4个小时跟踪WSDL中的类似问题 . 结果是WSDL使用了一个导入另一个命名空间XSD的XSD . 此导入的XSD包含以下内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
        xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">
    
     <include schemaLocation=""></include>  
        <complexType name="RequestType">
            <....
    

    注意空的 include 元素!这是我的困境的根源 . 我想这是上面没有找到Egor文件的变种问题 .

    1令人失望的错误报告 .

  • 0

    就我而言,删除'encoding =“UTF-8”'属性完全有效 .

    它看起来像一个字符集编码问题,可能是因为你的文件不是真正的UTF-8 .

  • 2

    我的答案可能对你没有帮助,但它一般有助于解决这个问题 .

    当您看到这种异常时,您应该尝试在任何十六进制编辑器中打开您的xml文件,有时您可以在文件开头看到文本编辑器未显示的其他字节 .

    删除它们,你的xml将被解析 .

  • 1

    如果所有其他方法都失败了,请打开二进制文件,以确保文件开头没有有趣的字符[文件开头有3个不可打印的字符,标识文件为utf-8] . 我们这样做了,发现了一些 . 所以我们将文件从utf-8转换为ascii并且它有效 .

  • 2

    对于同样的问题,我删除了以下行,

    File file = new File("c:\\file.xml");
      InputStream inputStream= new FileInputStream(file);
      Reader reader = new InputStreamReader(inputStream,"UTF-8");
      InputSource is = new InputSource(reader);
      is.setEncoding("UTF-8");
    

    它工作正常 . 不太确定为什么UTF-8会出现问题 . 为了让我感到震惊,它也可以用于UTF-8 .

    使用Windows-7 32位和Netbeans IDE与Java * jdk1.6.0_13 * . 不知道它是如何工作的 .

  • 2

    正如Mike Sokolov已经指出的那样,其中一个可能的原因是在标签之前存在一些字符(例如空格) .

    如果您的输入XML被读取为String(而不是字节数组),那么您可以使用以下代码替换输入字符串,以确保擦除xml标记之前的所有“不必要”字符 .

    inputXML=inputXML.substring(inputXML.indexOf("<?xml"));
    

    您需要确保输入xml以xml标记开头 .

  • 27

    我按照发现here的说明,我得到了同样的错误 .

    我在Notepad和XML Notepad中尝试了几种方法来解决它(即更改编码,键入XML文件而不是复制粘贴等),但没有任何效果 .

    当我在记事本中编辑并保存我的XML文件时,问题得到了解决(编码 - > utf-8没有BOM)

  • 0

    对于所有收到此错误的人:警告:使用conf / server.xml的Catalina.start:prolog中不允许使用内容 .

    信息量不大..但实际上这意味着你的conf / server.xml文件中有垃圾 .

    我在其他XML文件中看到了这个确切的错误 . 这个错误可能是由文本编辑器进行更改引起的介绍垃圾 .

    验证文件中是否有垃圾的方法是使用“HEX编辑器”打开它如果在此字符串之前看到任何字符

    "<?xml version="1.0" encoding="UTF-8"?>"
    

    像这样会是垃圾

    "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"
    

    这是你的问题....解决方案是使用一个好的HEX编辑器..一个允许您保存具有不同类型的编码的文件..

    然后将其保存为UTF-8 . 某些使用XML文件的系统可能需要将其保存为UTF NO BOM这意味着使用“NO Byte Order Mark”

    希望这有助于那里的人!

  • 1

    有时它是代码,而不是XML

    以下代码,

    Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));
    

    也会导致此错误,

    [致命错误]:1:1:prolog.org.xml.sax.SAXParseException中不允许内容; lineNumber:1; columnNumber:1;序言中不能有内容 .

    因为它试图解析字符串文字 "file.xml" (不是 file.xml 文件的内容)而失败,因为 "file.xml" 作为字符串不是格式良好的XML .

    Fix: Remove StringReader():

    Document doc = dBuilder.parse(new InputSource("file.xml"));
    

    同样,脏缓冲区问题可能会在实际XML之前留下残留垃圾 . 如果您仔细检查了XML并仍然收到此错误,请记录传递给解析器的确切内容;有时实际上(试图)解析的是令人惊讶的 .

  • 26

    在我的情况下,我的应用程序中的web.xml有额外的空间,即使我删除后没有工作,我不得不恢复chages及其修复,是的,我在我的tomcat中使用 logging.propertiesweb.xml ,但即使我恢复错误后仍然显示如此这固定了)) .

    extra space

    具体我尝试添加 org.apache.catalina.filters.ExpiresFilter.level = FINE stack over flow something about logging.properties

  • 0

    首先清理项目,然后重建项目 . 我也面临同样的问题 . 在此之后一切都好了 .

  • 209

    只是对未来的另一个想法 . 获得此错误的情况可能是,当一个XML窗口作为活动显示并且没有引起注意时,只需随机点击删除键或其他一些键 . 在我的Web应用程序中使用struts.xml文件之前发生过这种情况 . 笨笨的肘部......

  • 9

    我遇到过同样的问题 .

    首先我将XML文件下载到本地桌面,然后在导入文件到门户服务器期间得到 Content is not allowed in prolog . 即使是视觉文件对我来说看起来也不错,但不知怎的,它已经被破坏了 .

    所以我重新下载相同的文件,并尝试相同,它的工作原理 .

  • 0

    我们最近遇到了同样的问题,原来是一个错误的URL,因此标准的403 HTTP响应(显然不是客户端正在寻找的有效XML) . 我将分享细节,以防同一个上下文中的某个人遇到此问题:

    这是一个基于Spring的Web应用程序,其中“JaxWsPortProxyFactoryBean”bean配置为公开远程端口的代理 .

    <bean id="ourPortJaxProxyService"
        class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
        p:serviceInterface="com.amir.OurServiceSoapPortWs"
        p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
        p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
        p:portName="OurSoapPort" />
    

    “END_POINT_BASE_URL”是在托管Web应用程序的Tomcat实例的“setenv.sh”中配置的环境变量 . 文件的内容是这样的:

    export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
    #export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"
    

    失踪的“;”在每一行之后导致格式错误的URL并因此导致错误的响应 . 也就是说,URL不是“BusinessAppServices / OurService?wsdl”,而是在“/”之前有一个CR . 在解决问题时,“TCP / IP Monitor”非常方便 .

  • 0

    在我的情况下,我收到此错误,因为我使用的API可以以XML或JSON格式返回数据 . 当我使用浏览器测试它时,它默认为XML格式,但是当我从Java应用程序调用相同的调用时,API返回了JSON格式的响应,这自然触发了解析错误 .

  • 0

    即使我遇到过类似的问题 . 原因是文件开头的一些垃圾字符 .

    修复:只需在文本编辑器中打开文件(在Sublime文本上测试),删除文件中的任何缩进(如果有),并将文件的所有内容复制粘贴到新文件中并保存 . 而已! . 当我运行新文件时,它运行时没有任何解析错误 .

  • 1

    我接受了Dineshkumar的代码并修改为正确验证我的XML文件:

    import org.apache.log4j.Logger;
    
    public class Myclass{
    
    private static final Logger LOGGER = Logger.getLogger(Myclass.class);
    
    /**
     * Validate XML file against Schemas XSD in pathEsquema directory
     * @param pathEsquema directory that contains XSD Schemas to validate
     * @param pathFileXML XML file to validate
     * @throws BusinessException if it throws any Exception
     */
    public static void validarXML(String pathEsquema, String pathFileXML) 
    	throws BusinessException{	
    	String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
    	String nameFileXSD = "file.xsd";
    	String MY_SCHEMA1 = pathEsquema+nameFileXSD);
    	ParserErrorHandler parserErrorHandler;
    	try{
    		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA);
    		
    		Source [] source = { 
    			new StreamSource(new File(MY_SCHEMA1))
    			};
    		Schema schemaGrammar = schemaFactory.newSchema(source);
    
    		Validator schemaValidator = schemaGrammar.newValidator();
    		schemaValidator.setErrorHandler(
    			parserErrorHandler= new ParserErrorHandler());
    		
    		/** validate xml instance against the grammar. */
    		File file = new File(pathFileXML);
    		InputStream isS= new FileInputStream(file);
    		Reader reader = new InputStreamReader(isS,"UTF-8");
    		schemaValidator.validate(new StreamSource(reader));
    		
    		if(parserErrorHandler.getErrorHandler().isEmpty()&& 
    			parserErrorHandler.getFatalErrorHandler().isEmpty()){
    			if(!parserErrorHandler.getWarningHandler().isEmpty()){
    				LOGGER.info(
    				String.format("WARNING validate XML:[%s] Descripcion:[%s]",
    					pathFileXML,parserErrorHandler.getWarningHandler()));
    			}else{
    				LOGGER.info(
    				String.format("OK validate  XML:[%s]",
    					pathFileXML));
    			}
    		}else{
    			throw new BusinessException(
    				String.format("Error validate  XML:[%s], FatalError:[%s], Error:[%s]",
    				pathFileXML,
    				parserErrorHandler.getFatalErrorHandler(),
    				parserErrorHandler.getErrorHandler()));
    		}		
    	}
    	catch(SAXParseException e){
    		throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]",
    			pathFileXML,e.getMessage()),e);
    	}
    	catch (SAXException e){
    		throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]",
    			pathFileXML,e.getMessage()),e);
    	}
    	catch (IOException e) {
    		throw new BusinessException(String.format("Error validate XML:[%s], 
    			IOException:[%s]",pathFileXML,e.getMessage()),e);
    	}
    	
    }
    
    }
    
  • 0

    将文档设置为如下形式:

    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
        %children%
    </root>
    
  • 0

    我和 Spring 天有同样的问题

    MarshallingMessageConverter

    并通过预处理代码 .

    Mayby有人需要理由: BytesMessage #readBytes - reading bytes.. 我忘记了阅读是一个方向操作 . 你不能读两遍 .

  • 9

    在apache.commons.io中尝试使用BOMInputStream:

    public static <T> T getContent(Class<T> instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException {
    
        JAXBContext context = JAXBContext.newInstance(instance);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8");
    
        JAXBElement<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);
    
        return entry.getValue();
    }
    
  • 1

    对我来说, Build->Clean 修复了一切!

相关问题