web-dev-qa-db-ja.com

org.xml.sax.SAXParseException:コンテンツはプロローグで許可されていません

JavaベースのWebサービスクライアントがJava Webサービスに接続されています(Axis 1フレームワークに実装されています)。

ログファイルに次のような例外が表示されます。

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)
144
ag112

これはXML宣言の前の空白が原因であることがよくありますが、ダッシュや文字のように、任意のテキストでもかまいません。ホワイトスペースは常に無視できると人々が考えるので、私はしばしばホワイトスペースによって引き起こされると言いますが、それはここではそうではありません。


よく起こる別のことは、UTF-8 BOM(バイトオーダーマーク)です。これは、です。文書がバイトのストリームとしてではなく、文字のストリームとしてXMLパーサーに渡される場合、XML宣言を空白として扱うことができます。

スキーマファイル(.xsd)を使用してxmlファイルを検証し、スキーマファイルの1つにUTF-8 BOMが含まれている場合も、同じことが起こります。

216
Mike Sokolov

実際には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");

すべて同じエラーメッセージが表示されます。

次のトレースのため、非常に残念なバグ

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日を費やす必要がありました。

27
Egor

プロローグのencoding="UTF-8"ストリングと終了する?>の間にスペースを追加してみてください。 XMLでは、プロローグは文書の先頭でこのブラケットと疑問符で区切られた要素を指定します(stackoverflowのタグプロローグはプログラミング言語を参照します)。

追加:文書のプロローグ部分の前にダッシュがありますか?それはそこのエラーで、プロローグの前にデータがある-<?xml version="1.0" encoding="UTF-8"?>です。

26
hardmath

Freemarkerを使用してXML文書を解析しようとしたときに、私は同じ問題を抱えていました(そしてそれを解決しました)。

XMLファイルのヘッダーの前にスペースがありませんでした。

ファイルのエンコーディングとXMLのエンコーディング属性が異なる場合に限り、問題が発生します。(例:ヘッダーにUTF-16属性を持つUTF-8ファイル)。

だから私は問題を解決する2つの方法がありました:

  1. ファイル自体のエンコーディングを変更する
  2. ヘッダーUTF-16をUTF-8に変更
11
user2575850

XMLが不正な形式であるか、レスポンスボディがXML文書ではないことを意味します。

9
Yuriy Zubarev

WSDL内の同様の問題を追跡するのに4時間を費やしました。 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。

7
colin_froggatt

私の場合は、 'encoding = "UTF-8"'属性を完全に削除することでうまくいきました。

おそらくあなたのファイルが実際にはUTF-8ではないからかもしれません。

4
Jerome Louvel

私の答えはおそらくあなたを助けないでしょうが、それは一般にこの問題を助けます。

このような例外が発生した場合は、16進エディタでxmlファイルを開こうとする必要があります。また、テキストエディタでは表示されないファイルの先頭に追加のバイトが表示されることがあります。

それらを削除すると、あなたのXMLが解析されます。

3
Igor Kustov

Mike Sokolovがすでに指摘しているように、考えられる理由の1つは、タグの前にいくつかの文字(空白など)があることです。

入力XMLが(バイト配列ではなく)文字列として読み取られている場合は、入力文字列を次のコードに置き換えて、xmlタグの前にある「不要な」文字をすべて削除します。

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

ただし、入力xmlがxmlタグで始まっていることを確認する必要があります。

2
Sahil J

同じ問題について、私は次の行を削除しました、

  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 bitおよびNetbeans IDEをJava * jdk1.6.0_13 *と共に使用しています。それがどのように機能するのかわかりません。

まずプロジェクトをクリーンにしてから、プロジェクトを再ビルドします。私も同じ問題に直面していました。これですべてうまくいった。

2
user

それでもうまくいかない場合は、ファイルをバイナリで開いて、ファイルの先頭に変な文字[ファイルの先頭にutf-8として識別される3つの印刷不能文字]がないことを確認してください。私たちはこれをしていくつか見つけました。それで我々はファイルをutf-8からasciiに変換してそれはうまくいった。

2
Ralph

時にはそれがコードではなくXMLではない

次のコード

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

このエラーも発生します

[致命的なエラー]:1:1:prolog.org.xml.sax.SAXParseExceptionで内容は許可されていません。 lineNumber:1; columnNumber:1;コンテンツはプロローグで許可されていません。

文字列としての"file.xml"は整形式のXMLではないため、文字列リテラルfile.xml"file.xml"ファイルの内容ではない)を解析しようとして失敗しているためです。

修正:StringReader():を削除する:

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

同様に、バッファが汚れていると、実際のXMLよりも先にジャンクが残る可能性があります。 XMLを慎重にチェックしてもまだこのエラーが発生する場合は、パーサーに渡される内容を正確に記録してください。実際に解析しようとしていることが驚くことであることもあります。

1
kjhughes

このエラーが発生するものはすべて警告:conf/server.xmlを使用したCatalina.start:内容はプロローグでは許可されていません。

それほど有益ではありません。しかしこれが実際に意味することは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
CA Martin

Unix/LinuxシステムでBOMの問題を解決するには

  1. 不要なBOM文字があるかどうかを確認します。hexdump -C myfile.xml | more不要なBOM文字は、ファイルの先頭に...<?xml>として表示されます。

  2. あるいは、file myfile.xmlを実行してください。 BOM文字を含むファイルは、次のように表示されます。myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xmlで単一のファイルを修正する

  4. ファイルがサニタイズされたことを確認するには、1または2を繰り返します。内容を確認するためにview myfile.xmlを実行することもおそらく賢明です。

これは、XMLファイルのフォルダ全体をサニタイズするためのbashスクリプトです。

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

1
Lydia Ralph

私はここで見つけた の指示に従った そして私は同じエラーを受けた。

私はメモ帳とXMLメモ帳でそれを解決するためにいくつかのことを試みました(すなわち、エンコーディングの変更、コピーペーストではなくXMLファイルの入力)が、何もうまくいきませんでした。

XMLファイルをNotepad ++で編集して保存すると問題が解決しました(エンコーディング - > utf-8、BOMなし)

1
BitCollector

私の場合、アプリケーションのweb.xmlが削除されても機能しなかった後でも余分なスペースがあり、変更と変更を元に戻す必要があり、はいlogging.propertiesおよびweb.xmlTomcatで、エラーを元に戻した後も保持これが修正されたことを示しています))。

extra space

具体的には、org.Apache.catalina.filters.ExpiresFilter.level = FINEloging.propertiesについてのスタックオーバーフロー

1
shareef

私も同じような問題に直面していました。理由は、ファイルの先頭にゴミが入っていたことが原因です。

修正:テキストエディタ(Sublimeテキストでテスト済み)でファイルを開くだけで、ファイル内にインデントがある場合はそれを削除し、ファイルのすべてのコンテンツを新しいファイルにコピーアンドペーストして保存します。それでおしまい!。新しいファイルを実行したとき、解析エラーなしで実行されました。

0
Aditya Gaykar

私は同じ問題を抱えていました。

最初にXMLファイルをローカルデスクトップにダウンロードし、ポータルサーバーへのファイルのインポート中にContent is not allowed in prologを取得しました。視覚的なファイルでさえ私にはよさそうですが、どういうわけかそれは破損していました。

だから私は同じファイルを再ダウンロードし、同じことを試してみました、そしてそれはうまくいきました。

0
paresh

私の場合は、このエラーが発生しました。これは、使用したAPIがXMLまたはJSON形式でデータを返す可能性があるためです。ブラウザを使用してテストしたときのデフォルトはXML形式でしたが、Javaアプリケーションから同じ呼び出しを呼び出すと、APIはJSON形式の応答を返し、当然解析エラーが発生しました。

0
zovits

私は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
RodH

私たちは最近同じ問題を抱えていて、それは悪い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、ひいては悪い応答を引き起こしました。つまり、 "BusinessAppServices/OurService?wsdl"の代わりに、URLの "/"の前にCRがありました。問題を解決する間「TCP/IPモニタ」は非常に役に立ちました。

0
Amir Keibi

私にとっては、Build-> Cleanですべてが解決しました!

0
FabioLux

私も同じようになっていました

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

私のアプリケーションがRestFull Webサービス呼び出しに対するXML応答を作成していたとき。 XML形式の文字列を作成しているときに、&ltと&gtを<と>に置き換えた後、エラーが発生し、適切な応答が得られました。それがどのように機能したのかわからないが、それはうまくいった。

サンプル

String body = "<ns:addNumbersResponse xmlns:ns=\"http://Java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";
0
Satish M

文書をこのような形式に設定します。

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

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();
}
0

これについては、将来のための追加の考えです。アクティブバグとしてXMLウィンドウがあり、注意を払っていないときに、このバグが発生するのは、単にdeleteキーまたは他のキーをランダムに押すことです。これは私のWebアプリケーションのstruts.xmlファイルで以前に起こりました。不器用な肘...

0
demongolem

春にも同じ問題がありました

MarshallingMessageConverter

そして前処理コードによって。

たぶん誰かが理由が必要になります。BytesMessage #readBytes - バイトの読み取り..そして読み取りが一方向の操作であることを忘れました。二度読むことはできません。

0
Artem Ptushkin

私のMacでinfo.plistファイルを解析している間、私は同じ問題を抱えていました。ただし、この問題はファイルをXMLに変換する次のコマンドを使用して修正されました。

plutil -convert xml1 info.plist

誰かに役立つことを願っています。

0
Reaz Murshed