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)
これはXML宣言の前の空白が原因であることがよくありますが、ダッシュや文字のように、任意のテキストでもかまいません。ホワイトスペースは常に無視できると人々が考えるので、私はしばしばホワイトスペースによって引き起こされると言いますが、それはここではそうではありません。
よく起こる別のことは、UTF-8 BOM(バイトオーダーマーク)です。これは、はです。文書がバイトのストリームとしてではなく、文字のストリームとしてXMLパーサーに渡される場合、XML宣言を空白として扱うことができます。
スキーマファイル(.xsd)を使用してxmlファイルを検証し、スキーマファイルの1つにUTF-8 BOMが含まれている場合も、同じことが起こります。
実際には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日を費やす必要がありました。
プロローグのencoding="UTF-8"
ストリングと終了する?>
の間にスペースを追加してみてください。 XMLでは、プロローグは文書の先頭でこのブラケットと疑問符で区切られた要素を指定します(stackoverflowのタグプロローグはプログラミング言語を参照します)。
追加:文書のプロローグ部分の前にダッシュがありますか?それはそこのエラーで、プロローグの前にデータがある-<?xml version="1.0" encoding="UTF-8"?>
です。
Freemarkerを使用してXML文書を解析しようとしたときに、私は同じ問題を抱えていました(そしてそれを解決しました)。
XMLファイルのヘッダーの前にスペースがありませんでした。
ファイルのエンコーディングとXMLのエンコーディング属性が異なる場合に限り、問題が発生します。(例:ヘッダーにUTF-16属性を持つUTF-8ファイル)。
だから私は問題を解決する2つの方法がありました:
XMLが不正な形式であるか、レスポンスボディがXML文書ではないことを意味します。
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。
私の場合は、 'encoding = "UTF-8"'属性を完全に削除することでうまくいきました。
おそらくあなたのファイルが実際にはUTF-8ではないからかもしれません。
私の答えはおそらくあなたを助けないでしょうが、それは一般にこの問題を助けます。
このような例外が発生した場合は、16進エディタでxmlファイルを開こうとする必要があります。また、テキストエディタでは表示されないファイルの先頭に追加のバイトが表示されることがあります。
それらを削除すると、あなたのXMLが解析されます。
Mike Sokolovがすでに指摘しているように、考えられる理由の1つは、タグの前にいくつかの文字(空白など)があることです。
入力XMLが(バイト配列ではなく)文字列として読み取られている場合は、入力文字列を次のコードに置き換えて、xmlタグの前にある「不要な」文字をすべて削除します。
inputXML=inputXML.substring(inputXML.indexOf("<?xml"));
ただし、入力xmlがxmlタグで始まっていることを確認する必要があります。
同じ問題について、私は次の行を削除しました、
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 *と共に使用しています。それがどのように機能するのかわかりません。
まずプロジェクトをクリーンにしてから、プロジェクトを再ビルドします。私も同じ問題に直面していました。これですべてうまくいった。
それでもうまくいかない場合は、ファイルをバイナリで開いて、ファイルの先頭に変な文字[ファイルの先頭にutf-8として識別される3つの印刷不能文字]がないことを確認してください。私たちはこれをしていくつか見つけました。それで我々はファイルをutf-8からasciiに変換してそれはうまくいった。
次のコード
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を慎重にチェックしてもまだこのエラーが発生する場合は、パーサーに渡される内容を正確に記録してください。実際に解析しようとしていることが驚くことであることもあります。
このエラーが発生するものはすべて警告: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」で意味します
これが誰かに役立つことを願っています!
Unix/LinuxシステムでBOMの問題を解決するには
不要なBOM文字があるかどうかを確認します。hexdump -C myfile.xml | more
不要なBOM文字は、ファイルの先頭に...<?xml>
として表示されます。
あるいは、file myfile.xml
を実行してください。 BOM文字を含むファイルは、次のように表示されます。myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text
tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml
で単一のファイルを修正する
ファイルがサニタイズされたことを確認するには、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
私はここで見つけた の指示に従った そして私は同じエラーを受けた。
私はメモ帳とXMLメモ帳でそれを解決するためにいくつかのことを試みました(すなわち、エンコーディングの変更、コピーペーストではなくXMLファイルの入力)が、何もうまくいきませんでした。
XMLファイルをNotepad ++で編集して保存すると問題が解決しました(エンコーディング - > utf-8、BOMなし)
私の場合、アプリケーションのweb.xmlが削除されても機能しなかった後でも余分なスペースがあり、変更と変更を元に戻す必要があり、はいlogging.propertiesおよびweb.xmlTomcatで、エラーを元に戻した後も保持これが修正されたことを示しています))。
具体的には、org.Apache.catalina.filters.ExpiresFilter.level = FINEloging.propertiesについてのスタックオーバーフロー
私も同じような問題に直面していました。理由は、ファイルの先頭にゴミが入っていたことが原因です。
修正:テキストエディタ(Sublimeテキストでテスト済み)でファイルを開くだけで、ファイル内にインデントがある場合はそれを削除し、ファイルのすべてのコンテンツを新しいファイルにコピーアンドペーストして保存します。それでおしまい!。新しいファイルを実行したとき、解析エラーなしで実行されました。
私は同じ問題を抱えていました。
最初にXMLファイルをローカルデスクトップにダウンロードし、ポータルサーバーへのファイルのインポート中にContent is not allowed in prolog
を取得しました。視覚的なファイルでさえ私にはよさそうですが、どういうわけかそれは破損していました。
だから私は同じファイルを再ダウンロードし、同じことを試してみました、そしてそれはうまくいきました。
私の場合は、このエラーが発生しました。これは、使用したAPIがXMLまたはJSON形式でデータを返す可能性があるためです。ブラウザを使用してテストしたときのデフォルトはXML形式でしたが、Javaアプリケーションから同じ呼び出しを呼び出すと、APIはJSON形式の応答を返し、当然解析エラーが発生しました。
私は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);
}
}
}
私たちは最近同じ問題を抱えていて、それは悪い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モニタ」は非常に役に立ちました。
私にとっては、Build-> Cleanですべてが解決しました!
私も同じようになっていました
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>";
文書をこのような形式に設定します。
<?xml version="1.0" encoding="UTF-8" ?>
<root>
%children%
</root>
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();
}
これについては、将来のための追加の考えです。アクティブバグとしてXMLウィンドウがあり、注意を払っていないときに、このバグが発生するのは、単にdeleteキーまたは他のキーをランダムに押すことです。これは私のWebアプリケーションのstruts.xmlファイルで以前に起こりました。不器用な肘...
春にも同じ問題がありました
MarshallingMessageConverter
そして前処理コードによって。
たぶん誰かが理由が必要になります。BytesMessage #readBytes - バイトの読み取り..そして読み取りが一方向の操作であることを忘れました。二度読むことはできません。
私のMacでinfo.plist
ファイルを解析している間、私は同じ問題を抱えていました。ただし、この問題はファイルをXMLに変換する次のコマンドを使用して修正されました。
plutil -convert xml1 info.plist
誰かに役立つことを願っています。