2012-02-16 6 views
1

私はJPEGのメタデータから抽出してきたXMLを解析しようとしたJavaScriptのかなり単純なビットがあります。ここではXMLが正常に見えるときにjqueryのparseXML関数が失敗するのはなぜですか?

var xmlDoc; 
try { 
    xmlDoc = $.parseXML(xmlString); 
} catch(e) { 
    console.log(e); 
} 

がスローされます例外です:

あり
Invalid XML: <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0"> 
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
     <rdf:Description rdf:about="" 
      xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"> 
     <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions> 
     </rdf:Description> 
     <rdf:Description rdf:about="" 
      xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"> 
     <aux:SerialNumber>1</aux:SerialNumber> 
     <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens> 
     <aux:LensID>1</aux:LensID> 
     <aux:ImageNumber>6651</aux:ImageNumber> 
     <aux:FlashCompensation>0/1</aux:FlashCompensation> 
     </rdf:Description> 
    </rdf:RDF> 
</x:xmpmeta> 

そのXMLには何の問題もないようです。私はカットし、直接にそのXMLを貼り付ける場合、実際には、例外がスローされない:

var xmlDoc; 
try { 
    xmlDoc = $.parseXML('<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">   <rdf:Description rdf:about=""    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">    <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions>   </rdf:Description>   <rdf:Description rdf:about=""    xmlns:aux="http://ns.adobe.com/exif/1.0/aux/">    <aux:SerialNumber>1</aux:SerialNumber>    <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens>    <aux:LensID>1</aux:LensID>    <aux:ImageNumber>6651</aux:ImageNumber>    <aux:FlashCompensation>0/1</aux:FlashCompensation>   </rdf:Description>  </rdf:RDF> </x:xmpmeta>'); 
} catch(e) { 
    console.log("error parsing xml: " + e); 
} 

私が唯一の問題を引き起こしているどこかで印刷できない特殊文字のいくつかの種類が存在しなければならないと仮定することができます。その仮定をテストして修正するにはどうすればよいですか、それとも何か他のものが間違っていますか?このウェブサイトhttp://www.xmlvalidation.comを使用することにより

+1

jQuery自体はXMLをまったく解析しないことに注意してください。ブラウザはそうします。 – Pointy

+0

@Pointy、良い点。これはChromeで失敗していました。私はFireFoxで試して、それは大丈夫です。今何ができますか? Arg! –

答えて

4

私は問題を発見しました。私が推測したように、文字列の最後には厄介な印字不能な文字が潜んでいました。

私はハッキングのこのダーティビットでそれを削除することができた:

xmlString = xmlString.substr(xmlString.indexOf("<"), xmlString.lastIndexOf(">") + 1); 

それは明白でなければ、それは単に予想される角括弧ではない文字列の先頭と末尾から何かを離れてトリミングxmlドキュメントのjQuery関数 "trim()"は、不正な文字を削除するのに有効ではありませんでした。

私はそのキャラクターが何であるか分かりません。私の解決策には特に満足していませんが、それ以上の時間を費やすには余裕があります。一口。

+0

その文字はバイナリですか?あなたがそれがそこにないことを意味するわけではありませんが、それをトリミングすることはあなたが変数にそれを含めていないことを保証します。良いもの。 –

+0

確かに。私の心配は、最後の ">"の後に全くデータがあってはならないということです。どこかで最後にランダムな ">"があった場合、私のハックはうまくいかず、この問題が再び起こります。しかし、オッズは正しいのですか? ;) –

+0

jpgからどのようにメタデータを抽出しましたか?私はもっ​​と恥知らずにその部分に興味があります:) –

0

は、私は、次のエラーメッセージが表示されました、あなたは「外部のXMLスキーマに対して検証を」ボックスをチェックしてください

An error has been found! 

1: 62 cvc-elt.1: Cannot find the declaration of element 'x:xmpmeta'. 

XML document: 
1 <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0"> 
2  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
3   <rdf:Description rdf:about="" 
4    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"> 
5   <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions> 
6   </rdf:Description> 
7   <rdf:Description rdf:about="" 
8    xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"> 
9   <aux:SerialNumber>1</aux:SerialNumber> 
10   <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens> 
11   <aux:LensID>1</aux:LensID> 
12   <aux:ImageNumber>6651</aux:ImageNumber> 
13   <aux:FlashCompensation>0/1</aux:FlashCompensation> 
14  </rdf:Description> 
15  </rdf:RDF> 
16 </x:xmpmeta> 
+0

私はこれが問題だとは思わない。外部スキーマは定義されていないので、そのサイトがどのようなものに対して妥当性を確認しているのかわかりません。私はまた、クロームでparseXMLに失敗していない他の例もありますが、そのウェブサイトで同じエラーが発生します。 –

0

たぶん、あなたの問題がある
あなたがすることはできませんXMLヘッダを持たないファイルに対してXML関数(JS内)を使用します。
ブラウザでXMLファイル/入力を開き(アドレスバーのパスを入力してください)、
とし、xmlファイルまたは類似のテキストファイルとして開いているかどうかを確認してください。 emampleため

、PHPでXMLヘッダーを追加:

header ("Content-Type: text/xml"); 
+0

xmlの入力データは実際にはJavaScriptのバイナリJPEGファイルから手作業で切り出した文字列でした。私は最後に自分の問題を解決しましたが(私の答えを見てください)、提案に感謝します。 –

関連する問題