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


161

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)

11
解析しようとしているXMLを見せてくれると助かります。(最初の数行でうまくいくと思います。)
スティーブンC

Stephenに感謝します。AXISフレームワークからXMLリクエストを取得して、ここに貼り付けようとしています。したがって、上記のエラーの一般的な理解は、XMLが整形式ではないということです。
ag112

xmlファイルではなくxmlファイルの文字列名を文字列として変換しようとしたため、この問題が発生しました。:P
Gaʀʀʏ

回答:


242

これは多くの場合、XML宣言の前の空白によって引き起こされますが、ダッシュや任意の文字などの任意のテキストである可能性があります。空白は常に無視できるものであると人々が考えるので、しばしば空白によって引き起こされると私は言いますが、それはここでは当てはまりません。


よく発生するもう1つの問題は、UTF-8 BOM(バイトオーダーマーク)です。これ、ドキュメントがバイトストリームとしてではなく、文字のストリームとしてXMLパーサーに渡される場合に、XML宣言が空白として扱われる前に許可されます。 。

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


17
変更:w00teの提案-ジョン・ハンフリーズをどうするかを理解するのに苦労私のような皆のためDocument document = documentBuilder.parse(new InputSource(new StringReader(xml)))Document document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))
RealMan

32

実際にはユーリーズバレフの投稿に加えて

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


ファイル名の代わりにディレクトリを解析しようとするのと同じです、FWIW。
rogerdpack 2015年

... @Egorこれが、誰もがXMLを嫌う理由です。そのような愚かな失敗のために2日間の仕事を失う..
Gewure

@Gewureに絶対に同意します:)それは2012年からのいくつかの古代の投稿であり、私はそれを忘れさえしましたが、本当です
Egor

1
これは、正しいパスがあっても、次のような特別な記号を使用した場合にも発生します。C:\#MyFolder \ My.XMLファイルは存在しますが、「#」はXMLパーサーに問題を引き起こします... Java自体、およびM $ Windows、このフォルダ名には問題ありません...非常に悪い例外メッセージの動作....
Alex

26

encoding="UTF-8"プロローグの文字列と終了文字の間にスペースを追加してみてください?>。XMLでは、プロローグはドキュメントの開始時にこのブラケットと疑問符で区切られた要素を指定します(一方、stackoverflowのタグのプロローグはプログラミング言語を指します)。

追加:ダッシュは、ドキュメントのプロローグ部分の前にありますか?これは、プロローグの前にデータがあるというエラーになります-<?xml version="1.0" encoding="UTF-8"?>


1
+1。XMLプロローグにスペースが含まれている場合でも、一部のXMLパーサーはこの例外を回避することがわかりました。そのため、<?xml ver...ビットの前に何もないことを確認することは間違いありません。

11

freemarkerを使用してXMLドキュメントを解析しようとしたときに、同じ問題が発生しました(解決されました)。

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

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

だから私は問題を解決する2つの方法を持っていました:

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

1
一般に、パーサーが文字エンコーディングに関する矛盾する情報を受け取る場合は、この問題が発生する可能性があると思います。
Raedwald 2014

9

これは、XMLの形式が正しくないか、応答本文がXMLドキュメントではないことを意味します。


チェックしたところ、XMLは整形式であるように見えます。<XMLバージョンは、= "1.0"エンコード= "UTF-8"?> <soapenv:封筒のxmlns:soapenv =」 - :ここにスナップショットがあるschemas.xmlsoap.org/soap/envelope "のxmlns:XSD =" w3.org/ 2001 / XMLSchema "xmlns:xsi =" w3.org/2001/XMLSchema-instance "> <soapenv:Header> <wsse:Security xmlns:wsse =" docs.oasis-open.org/wss/2004/01/… " soapenv:mustUnderstand = "1"> .... </ wsse:Security> </ soapenv:Header> <soapenv:Body> .XX .. </ soapenv:Body> </ soapenv:Envelope>
ag112

1
はい、前にダッシュがあると、XMLが壊れます。
Yuriy Zubarev、2011

7

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は残念なエラー報告です。


4

私の場合、 'encoding = "UTF-8"'属性を完全に削除して機能しました。

ファイルが実際にはUTF-8でないためか、文字セットエンコーディングの問題のようです。


4

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

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

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


4

時にはそれは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ではないため失敗します。

修正:削除StringReader()

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

同様に、ダーティバッファの問題により、実際のXMLよりも前にジャンクが残る可能性があります。XMLを注意深く確認してもこのエラーが発生する場合は、パーサーに渡される正確な内容をログに記録してください。実際に解析されている(試行されている)ものは意外な場合があります。


1
applicaionContext.xmlコードにパスを追加するのを忘れて、コードをチェックインしなかったため、この解決策は正しいパスを導き、XMLファイルのみでエラーを探していました
Mrinmoy

3

最初にプロジェクトをクリーンアップし、次にプロジェクトを再構築します。私も同じ問題に直面していました。この後、すべてがうまくいきました。


2

他のすべてが失敗した場合は、ファイルをバイナリで開いて、ファイルの先頭に変な文字[ファイルの先頭に、ファイルをutf-8として識別する3つの印刷できない文字]がないことを確認します。私たちはこれを行い、いくつかを見つけました。そのため、ファイルを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 * jdk1.6.0_13 *のJavaで32ビットとNetBeans IDEを。どのように機能するかわかりません。


2

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

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

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

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


2

私の場合はweb.xmlの私のアプリケーションでは、私がchagesとその修正を元に戻す必要があったとはい私が遊んでいた動作しませんでした削除した後でも、余分なスペースがありlogging.propertiesweb.xmlの私のTomcatのではなく、私が戻った後も、エラーが表示され続けるので、これで修正されました))。

余分なスペース

具体的には、org.apache.catalina.filters.ExpiresFilter.level = FINE スタックを追加して、logging.propertiesについて何かをフローに追加してみました


1

ここにある指示に従いましが、同じエラーが発生しました。

私はそれを解決するためにいくつかのことを試みました(つまり、エンコーディングを変更し、コピーを貼り付けるのではなく、XMLファイルを入力しました)。

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


1

このエラーが発生するすべての場合:警告: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として保存する必要があります。これは、「バイトオーダーマークなし」を意味します。

これが誰かを助けることを願っています!!



1

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

0

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


キーを叩かないようにしました
Mad-D

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を<と>に置き換えたところ、エラーが発生し、適切な応答が得られました。どのように機能したかはわかりませんが、機能しました。

サンプル

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

0

同じ問題がありました。

最初に、XMLファイルをローカルデスクトップにダウンロードし、Content is not allowed in prologポータルサーバーへのファイルのインポート中に取得しました。見た目でもファイルは良さそうでしたが、どういうわけか壊れていました。

そのため、同じファイルを再度ダウンロードして同じことを試しましたが、うまくいきました。


0

最近同じ問題が発生しましたが、URLが悪いため、標準の403 HTTP応答であることが判明しました(クライアントが探している有効なXMLではないことは明らかです)。同じコンテキスト内の誰かがこの問題に遭遇した場合に備えて、詳細を共有します。

これは、「JaxWsPortProxyFactoryBean」Beanがリモートポートのプロキシを公開するように構成されたSpringベースのWebアプリケーションでした。

<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

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


0

私も同じような問題に直面していました。理由は、ファイルの先頭にある文字化けです。

修正:テキストエディタでファイルを開き(Sublimeテキストでテスト)、ファイル内のインデントを削除し、ファイルのすべてのコンテンツをコピーして新しいファイルに貼り付けて保存します。それでおしまい!。新しいファイルを実行すると、解析エラーなしで実行されました。


0

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

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

MarshallingMessageConverter

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

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


0

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

info.plistMacでファイルを解析しているときにも同じ問題が発生していました。ただし、ファイルをXMLに変換する次のコマンドを使用して問題が修正されました。

plutil -convert xml1 info.plist

それが誰かを助けることを願っています。


0

一部のXMLファイルでも同じ問題が発生しました。ANSIエンコーディング(Windows-1252)でファイルを読み取り、Pythonの小さなスクリプトでUTF-8エンコーディングでファイルを書き込むことを解決しました。Notepad ++を使用してみましたが、うまくいきませんでした。

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.