プロが教えるわが家の防犯対策術!

body 内に <xml id="UTIs" src="UTIs.xml"> をおき、onLoad で UTTypeGetIconsFile("public.plain-text") を呼び出すのですが、うまくいきません。実際には "public.plain-text.icons" を得たいのですが、どこが間違っているのでしょうか。

[JavaScript]
function UTTypeGetIconsFile(UTTypeIdentifier) {
roots = UTIs.XMLDocument;
keys = root.getElementsByTagName("key");
for (i=0; i<keys.length; i++) {
if (keys[i].innerText == "UTTypeIdentifier") {
if (keys[i].nextSibling.innerText == 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;
}
}
}

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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>

ブラウザは IE6 です。

A 回答 (10件)

試してみました。


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")を使って読み込めばいいかと思います。

この回答への補足

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

補足日時:2006/09/09 11:22
    • good
    • 0

>実行すると dict が宣言されていないとエラーになります。

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

この回答への補足

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

補足日時:2006/09/09 23:52
    • good
    • 0

#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ファイルの読込に失敗していると思われます。

この回答への補足

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

補足日時:2006/09/10 17:10
    • good
    • 0

#3>HTML ファイルと XML ファイルを変更してみましたが、同じエラーが出ます


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

この回答への補足

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

補足日時:2006/09/11 18:18
    • good
    • 0

#4>body に埋め込んだところきちんとダイアログが表示されました。


とりあえず、スクリプトはOKということですね。(おめでとうございます。)

>なぜ XML を外部参照にすると読み込めないのでしょうか…。
#1の繰り返しになりますが、DOCTYPE 部分は、削除してありますか?
HTML とXMLの文字コードは、合わせてありますか?(これは関係ないかも知れません)
ウチで試してみたところでは、DOCTYPE を削除したものは、読み込めましたよ。

この回答への補足

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

補足日時:2006/09/11 21:42
    • good
    • 0

#5>どちらもメモ帳で書いているので、エンコーディングは合っていると思います。


普通にメモ帳で作成したら、Shift_JISになってしまいますが、
文字コードUTF-8を指定して保存していますか?

この回答への補足

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

補足日時:2006/09/12 17:20
    • good
    • 0

#6>どちらともエンコーディングは shift_jis を宣言しています。


そうですか、それでは、とりあえず文字コード的には問題ないですね。

#5>XML に関する ActiveX コントロールが欠けている(?)とかなんでしょうか…。
ウチの環境は、IEでデフォルトにインストールされるMSXMLより新しいのが入っていますが、
<xml id="UTIs" src="UTIs.xml" ></xml>
の構文はIEでは、結構古くから使えましたから関係ないと思います。
同一フォルダにある他のファイル(例えば、画像ファイルなど)は読めますか?

なんだったら、XMLDOM による読込を試してみますか?
    • good
    • 0

<!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 があっても正しく読み込めました。

この回答への補足

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

補足日時:2006/09/12 20:34
    • good
    • 0

#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版でもそうだけど、念のため)
まあ、そういう不安要素を消しておくこと(原因をなるべく限定すること)がこういう場合には大事ですね。

この回答への補足

フルパスを指定してみましたが、やはり同じ結果でした。よくチェックしているので大文字小文字などの間違いは絶対ないと思います。
実際の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>

補足日時:2006/09/14 22:26
    • good
    • 0

#9補足のXMLを使用しても問題なく実行できました。


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

この回答への補足

>文字コードが変換されているとか…
ファイルを直接アップロードしているので、そのようなことは多分ないと思いますが…。
以下の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>

補足日時:2006/09/15 17:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/15 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!