• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:どこが間違っているのでしょうか)

JavaScriptのXML解析についてのエラー

このQ&Aのポイント
  • 質問者は、body内に特定のXML要素を配置し、JavaScriptでその要素を解析して特定の情報を取得しようとしています。
  • しかし、実際には適切な結果が得られず、問題を抱えています。
  • 質問者は、ブラウザがIE6であることも指摘しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

#9補足のXMLを使用しても問題なく実行できました。 やはり、"XML read error" になるのですね? XMLファイルをアップする時に文字コードが変換されているとか権限として読めないようになっていたりしませんか? 今回のコードとは別に、日本語を含まない凄く単純なXMLファイルだと読み込めますか? 例えば <plist><key>XXX</key></plist> のようなもの

tooton
質問者

お礼

ソースをチェックしていたところ、終了タグ"</string>"が"/string>"になっているところがありました。大変ご迷惑をおかけしました。専用のソフトを持っていたらもっと早く発見できたのですが。本当にありがとうございました。20ptまでしかないのが残念です。たくさん勉強になることがありました。

tooton
質問者

補足

>文字コードが変換されているとか… ファイルを直接アップロードしているので、そのようなことは多分ないと思いますが…。 以下のXMLで試したところ、きちんと動作しました。 やはりXMLの記述に問題があるようです。 <xml version="1.0" encoding="utf-8"> <plist version="1.0"> <dict> <key>UTTypeIdentifier</key> <string>public.plain-text</string> <key>UTTypeiconsFile</key> <string>public.plain-text.icons</string> </dict> </plist> </xml>

その他の回答 (9)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.9

#8>エラートラップに引っかかってしまいます。 つまり、やはり読み込めないということですね。 (case 1)パスが違っていて読めない ファイルへのパスをフルパスで指定してみて下さい。 (ファイル名の大文字小文字が違っていないかも点検して下さい) xmldoc.load("C:\\UTIs.xml");//ローカルの場合 xmldoc.load('http://yoursite.ne.jp/xml/UTIs.xml');//WEBの場合 (case 2)XMLの内容にまだエラーとなるものがある。 質問文のXMLではなくて、実際に使用しているモノが違うのであれば補足して下さい。 #8>XMLファイルもUTF-8で保存し直し、エンコードの宣言も書き直したのです XMLDOM版では、それぞれのエンコードと宣言が正しければ必ずしも揃える必要はないです。(HTML版でもそうだけど、念のため) まあ、そういう不安要素を消しておくこと(原因をなるべく限定すること)がこういう場合には大事ですね。

tooton
質問者

補足

フルパスを指定してみましたが、やはり同じ結果でした。よくチェックしているので大文字小文字などの間違いは絶対ないと思います。 実際のXMLは次のような感じです。実際は深い方のdictタグは更に多くあります。 <xml version="1.0" encoding="utf-8"> <plist version="1.0"> <dict> <key>UTExportedTypeDeclarations</key> <array> <dict> <key>UTTypeIdentifier</key> <string>public.plain-text</string> <key>UTTypeDescription</key> <string>標準テキスト</string> <key>UTTypeiconsFile</key> <string>public.plain-text.icons</string> <key>UTTypeConformsTo</key> <array> <string>public.text</string> </array> <key>public.filename-extension</key> <array> <string>text</string> <string>txt</string> </array> </dict> <dict> <key>UTTypeIdentifier</key> <string>com.compuserve.gif</string> <key>UTTypeDescription</key> <string>GIF イメージ</string> <key>UTTypeiconsFile</key> <string>com.compuserve.gif.icons</string> <key>UTTypeConformsTo</key> <array> <string>public.image</string> </array> <key>public.filename-extension</key> <array> <string>gif</string> </array> </dict> </array> </dict> </plist> </xml>

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>XMLの読み出し</title> <script type="text/javascript"><!-- function UTTypeGetIconsFile(UTTypeIdentifier) { var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.async = false; stat=xmldoc.load('UTIsORG.xml'); // if(xmldoc.parseError.errorCode != 0)alert("XML read error"); if(!stat)alert("XML read error"); root = xmldoc.documentElement; keys = root.getElementsByTagName("key"); for (i=0; i<keys.length; i++) { if (keys[i].text == "UTTypeIdentifier") { if (keys[i].nextSibling.text == UTTypeIdentifier) { dict = keys[i].parentNode; } } } keys = dict.getElementsByTagName("key"); for (i=0; i<keys.length; i++) { if (keys[i].text == "UTTypeiconsFile") { return keys[i].nextSibling.text; } } } window.onload=function(){ alert(UTTypeGetIconsFile("public.plain-text")); }; //--> </script> </head> <body> </body> </html> ---------------------------------------------------------------- XMLDOM版を作ってみました。 今回XMLDOM版で気付いたのですが、 XMLDOM版では、DOCTYPE を削除しないで読み込めるはずなのですが、削除しないでは読み込めませんでした。 DTDを確認してみると、 plist の直下に<key> は、存在できないので読込エラーになります。 (<key>UTExportedTypeDeclarations</key>の部分) それを修正してみると<xml src="…">でもDOCTYPE があっても正しく読み込めました。

tooton
質問者

補足

わざわざ書いてくださってありがとうございます。 ソースをメモ帳に貼り付けUTF-8で保存しました。 それと、"UTIsORG.xml"を"UTIs.xml"にかえ、 XMLファイルもUTF-8で保存し直し、エンコードの 宣言も書き直したのですが、設定してくださった エラートラップに引っかかってしまいます。 ><plist>の直下に<key>は存在できない そういえばplistの子はdictかarrayでした・・・。 それで、子をすべて<dict>で挟みました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#6>どちらともエンコーディングは shift_jis を宣言しています。 そうですか、それでは、とりあえず文字コード的には問題ないですね。 #5>XML に関する ActiveX コントロールが欠けている(?)とかなんでしょうか…。 ウチの環境は、IEでデフォルトにインストールされるMSXMLより新しいのが入っていますが、 <xml id="UTIs" src="UTIs.xml" ></xml> の構文はIEでは、結構古くから使えましたから関係ないと思います。 同一フォルダにある他のファイル(例えば、画像ファイルなど)は読めますか? なんだったら、XMLDOM による読込を試してみますか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#5>どちらもメモ帳で書いているので、エンコーディングは合っていると思います。 普通にメモ帳で作成したら、Shift_JISになってしまいますが、 文字コードUTF-8を指定して保存していますか?

tooton
質問者

補足

すみません、説明が抜けてしまいました。 途中で shift_jis で保存していたのに気がついて どちらともエンコーディングは shift_jis を宣言しています。 回答#1からその上で補足しているねで、エンコーディングは問題ないと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4>body に埋め込んだところきちんとダイアログが表示されました。 とりあえず、スクリプトはOKということですね。(おめでとうございます。) >なぜ XML を外部参照にすると読み込めないのでしょうか…。 #1の繰り返しになりますが、DOCTYPE 部分は、削除してありますか? HTML とXMLの文字コードは、合わせてありますか?(これは関係ないかも知れません) ウチで試してみたところでは、DOCTYPE を削除したものは、読み込めましたよ。

tooton
質問者

補足

>おめでとうございます ありがとうございます。とりあえず安心します。 XML からは DOCTYPE を削除しました。 どちらもメモ帳で書いているので、 エンコーディングは合っていると思います。 XML に関する ActiveX コントロールが 欠けている(?)とかなんでしょうか…。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3>HTML ファイルと XML ファイルを変更してみましたが、同じエラーが出ます とりあえず、#3は、試されたでしょうか? 試した結果を教えてください。 #3の後段部分の場合は、XML ファイル(の変更)でなくて、 <xml id="UTIs" src="UTIs.xml" ></xml> の部分をHTML に直接(埋め込む形で)記述してみて動くかどうか試して欲しいという意味ですけど、それはやってみましたか?

tooton
質問者

補足

>HTML に直接(埋め込む形で) body に埋め込んだところきちんとダイアログが表示されました。 なぜ XML を外部参照にすると読み込めないのでしょうか…。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>修正した上で実行しました 以下はウチで試してみたソースです。 こちらを使ってテストしてみていただけますか? ---------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>XMLの読み出し</title> <script type="text/javascript"><!-- function UTTypeGetIconsFile(UTTypeIdentifier) { root = UTIs.XMLDocument; keys = root.getElementsByTagName("key"); for (i=0; i<keys.length; i++) { if (keys[i].text == "UTTypeIdentifier") { if (keys[i].nextSibling.text == UTTypeIdentifier) { dict = keys[i].parentNode; } } } keys = dict.getElementsByTagName("key"); for (i=0; i<keys.length; i++) { if (keys[i].text == "UTTypeiconsFile") { return keys[i].nextSibling.text; } } } window.onload=function(){ alert(UTTypeGetIconsFile("public.plain-text")); }; //--> </script> </head> <body> <xml id="UTIs" src="UTIs.xml" ></xml> </body> </html> --------------------------------------------------------------- コレでダメな場合、まずは、 <xml id="UTIs"> <plist version="1.0"> <key>UTExportedTypeDeclarations</key> <array> <dict> <key>UTTypeIdentifier</key> <string>public.plain-text</string> <key>UTTypeiconsFile</key> <string>public.plain-text.icons</string> <!-- 実際には更に続きます --> </dict> <!-- この後もdictタグが続きます --> </array> </plist> </xml> でテストしてみてください。 それでスクリプトが動作するようなら、XMLファイルの読込に失敗していると思われます。

tooton
質問者

補足

お世話になります。HTML ファイルと XML ファイルを変更してみましたが、同じエラー(dict が宣言されていない)が出ます。HTML ファイルと同じフォルダ内に XML ファイル "UTIs.xml" を置いているのですが、パスの設定に誤りがあるのでしょうか…?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>実行すると dict が宣言されていないとエラーになります。調べてみたところ、前半の for 文内が全く実行されていないようです。というわけで、keys が空のようなのですが。 質問にあげられている当初の状態がそうです。 dict は、最初のループで始めて使われているので、 最初のループで見つからなかった場合、 次のループで参照しようとすると、宣言されていないということになります。 原因は、仰るとおり >keys = root.getElementsByTagName("key"); で該当するノードリストがない。 >if (keys[i].innerText == "UTTypeIdentifier") { if で一致すると判定できない というような理由が考えられます。 #1での回答は、これらを修正するものですが、 #1の回答の修正をした上での、補足質問でしょうか?

tooton
質問者

補足

書き漏らしてしまってすみません。はい、修正した上で実行しましたが、keys の要素数が 0 でした。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

試してみました。 root = UTIs.XMLDocument; if (keys[i].text == "UTTypeIdentifier") { if (keys[i].nextSibling.text == UTTypeIdentifier) { に修正して、 [XML] からDOCTYPE 部分を削除すると望むような動作になりました。 <xml src="~"></xml> でHTML文書内に埋め込む場合、DOCTYPE は、埋め込めないということだと思います。(HTML 違反になるし・) DTD 宣言部分を削除できない場合は、 埋め込みにしないで、ActiveXObjext("Microsoft.XMLDOM")を使って読み込めばいいかと思います。

tooton
質問者

補足

実行すると dict が宣言されていないとエラーになります。調べてみたところ、前半の for 文内が全く実行されていないようです。というわけで、keys が空のようなのですが。

関連するQ&A