- PR -

FireFoxでの XML, JavaScript, DOMについて質問です。

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/01/04
投稿数: 1
投稿日時: 2005-01-04 07:27
はじめまして。
次のようなコードを使って、FirefoxでXML, DOMを操作したいと考えています。

var domDocument = document.implementation.createDocument("", "", null);
domDocument.async = false;domDocument.load('test1.xml');
var root = domDocument.documentElement;var book = root.childNodes;
var bl = book.length;
document.getElementById("place").innerHTML = bl;
document.getElementById("place").innerHTML += book.item(0).getElementsByTagName("author").item(0).text;

まず、var bl = book.length で帰ってくる配列の大きさが
実際とは異なってしまいます。
次に、book.item(0).getElementsByTagName("author").item(0).text;
もうまくいかず、FFのJavaScriptコンソールで"関数ではない"と
言われてしまいます。

ちょっと前にXMLをはじめたばかりで、質問させていただくのは
恐縮なのですが、もしご教示いただけるとありがたいです。


にゃる
会議室デビュー日: 2005/01/08
投稿数: 2
投稿日時: 2005-01-08 08:29
> まず、var bl = book.length で帰ってくる配列の大きさが
> 実際とは異なってしまいます。
> 次に、book.item(0).getElementsByTagName("author").item(0).text;
> もうまくいかず、FFのJavaScriptコンソールで"関数ではない"と
> 言われてしまいます。
わたしも、同じようなことで悩みました。苦しまぎれにXMLを単独で読み込んだ状態でDOMインスペクタを開いたら、なんとなくわかりました。

まず、childNodesで返えされるリストには空行などの分も含まれているようです。

つぎに、book.item(0).getElementsByTagName("author").item(0).textで追い詰めたと思ってもDOMインスペクタによると、さらに子ノードを持っているようです。

book.item(0).getElementsByTagName("author").item(0).childNodes[0]

等の記述をしないと駄目みたいです。あとはDOMインスペクタの右のペインの上の方にある表示切り替えでJavascript Objectに切り替えると、どのプロパティに値が入っているかがわかります。わたしの場合はよくわからないのでnodeValueを使って、

book.item(0).getElementsByTagName("author").item(0).childNodes[0].nodeValue

とすると、多分値が取れるかもしれません。 が...book.item(0)が空行ならば、うまくいきません。実用的にはそれぞれの要素の有効性を確かめる必要があると思います。

これだけ、知るのに10時間位い費やしてしまった(^^;

ちなみに、test1.xmlファイルそのものがないので、大きく外しているかも知れません。そのばあいは、まぁ、経験談ということで(^^;
にゃる
会議室デビュー日: 2005/01/08
投稿数: 2
投稿日時: 2005-01-10 19:10
以前の書込みの補足をします(^^;

> まず、var bl = book.length で帰ってくる配列の大きさが
> 実際とは異なってしまいます。
FirefoxのJavascriptでXML(表現は。。。あってる?)を読み込むと空行などのタグ付けされていない要素も入るようです。たぶん、これはDOS時代からの悪き習慣なのかもしれません。

> 次に、book.item(0).getElementsByTagName("author").item(0).text;
> もうまくいかず、FFのJavaScriptコンソールで"関数ではない"と
> 言われてしまいます。
(XMLの)見掛けが先頭だからといって、item(0)というのは危険です。XMLを読み込んでDOMインスペクタで観てください。*.item(0)の下にさらに要素があるとおもいます...まぁ、実装としては、気持はわからなくないのですが...要素が1つであってもitem(0)の下にも子ノード がぶらさっています。つまり、item(0)にも上位ノードと同じようなチェックが必要だということです。

> ちょっと前にXMLをはじめたばかりで、質問させていただくのは
> 恐縮なのですが、もしご教示いただけるとありがたいです。
JavascriptでXMLをはじめて扱いました...XMLのonloadコールバックで、グローバル変数を書換えたはずなのに、コールバックを抜けたら変数が元に戻っていたり...Scheme位に単純明快にして欲しいものです(^^;(ふーむ、むずかしい)



_________________
1

スキルアップ/キャリアアップ(JOB@IT)