java.net.MalformedURLException:プロトコルなし


173

次のようなJava例外が発生します。

java.net.MalformedURLException: no protocol

私のプログラムは、次を使用してXML文字列を解析しようとしています:

Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(xml);

XML文字列には以下が含まれます。

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
    "   <s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
    "       <s:Header>"+
    "           <ActivityId CorrelationId=\"15424263-3c01-4709-bec3-740d1ab15a38\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\">50d69ff9-8cf3-4c20-afe5-63a9047348ad</ActivityId>"+
    "           <clalLog_CorrelationId xmlns=\"http://clalbit.co.il/clallog\">eb791540-ad6d-48a3-914d-d74f57d88179</clalLog_CorrelationId>"+
    "       </s:Header>"+
    "       <s:Body>"+
    "           <ValidatePwdAndIPResponse xmlns=\"http://tempuri.org/\">"+
    "           <ValidatePwdAndIPResult xmlns:a=\"http://schemas.datacontract.org/2004/07/ClalBit.ClalnetMediator.Contracts\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
    "           <a:ErrorMessage>Valid User</a:ErrorMessage>"+
    "           <a:FullErrorMessage i:nil=\"true\" />"+
    "           <a:IsSuccess>true</a:IsSuccess>"+
    "           <a:SecurityToken>999993_310661843</a:SecurityToken>"+
    "           </ValidatePwdAndIPResult>"+
    "           </ValidatePwdAndIPResponse>"+
    "       </s:Body>\n"+
    "   </s:Envelope>\n";

このエラーの原因について何か提案はありますか?


正確にどこにそのエラーメッセージが表示されますか?XMLを解析しているとき、またはネットワーク経由で送信しようとしているときは?構文解析中にこれを取得した場合、それは本当に奇妙なことです。
Jesper、

回答:


368

ドキュメントはあなたを助けることができます:http : //java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

このメソッドDocumentBuilder.parse(String)はURIを受け取り、それを開こうとします。コンテンツを直接指定したい場合は、InputStreamorやReader、たとえばを指定する必要がありStringReaderます。...間接参照のJava標準レベルへようこそ!

基本的に :

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new StringReader(xml)));

ファイルからXMLを読み取る場合、Fileオブジェクトをに直接渡すことができますDocumentBuilder.parse()

ちなみに、これはJavaでよく遭遇するパターンです。通常、ほとんどのAPIは文字列よりもストリームで機能します。ストリームを使用することは、すべてのコンテンツを同時にメモリにロードする必要がない可能性があることを意味します。これは素晴らしいアイデアです。


2
@Guillaume、そうすることで私はdocument = nullを取得します。なぜこれが起こるのですか?
HenioJR 2014年

1
コードを見てみないとわかりません。多分あなたの入力は無効であり、どういうわけか例外を飲み込みます...
Guillaume

このコード行は、実行に時間がかかります。パフォーマンスを向上させる方法はありますか?
Raj Shah、

1
文字列パラメータを解析するXMLになっていたこと(もちろん、愚かに)仮定私にとって+1が....もちろん、それは作る完璧な ....代わりにURIを期待する感覚を
nterry

@RajShahこのロジックは起動時にのみ実行する必要があるため、より長い時間のヒットは問題になりません。あなたは非常に頻繁に設定を変更する必要があり、どちらか....べきではない
nterry

24

代わりに試してくださいdb.parse(xml)

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.