どうやっていけばいいですか?私のウィジェットなクラッシュがない場合は値のxmlノード?

StackOverflow https://stackoverflow.com/questions/671861

質問

もしかしたら、xmlファイルを取得したいデータからです。ソースのxmlいかが私の転のため特定の分野:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

現在この作品のような魅力がある場合を除き、無価値のノードです。その構造は以下のようになっています:

<xml>
 <one>
  <two>nodeValue</two>
 </one>
 <one>
  <two></two>
 </one>
</xml>

るウィジェットが表示されますクラッシュの"一ノードがありますのでない値に'two'ノードです。コンソールには:

TypeError: tracks.item(i).childNodes.item(4).childNodes.item(0) has no properties

そのアイデア上書きすることができるようになウィジェットのためだ空として空文字列(nullの場合、空、または"")ではなく、チ?私は推測もの データ, getValue(), テキスト, 又は、地下鉄からも近くて便利。

を使用

var track= xmlDoc.getElementsByTagName('track')[0];
var info= track.getElementsByTagName('artist')[0];
var value= info.firstChild? info.firstChild.data : '';

なを返します"例外:トラックがないproperties"があります。これからのラインがアーティストの呼び出されます。

役に立ちましたか?

解決 3

ヤフー!ウィジェットは、ウィジェットに、ブラウザ・コードを使用できるようにするために必要なすべての基本的なJavaScriptの機能を実装していません。

の代わりに使用したのます:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

これは文字列への直接変換でのXpathを使用することをお勧めします値を取得します。文字列は、Yahoo!で空の場合それはどんな障害を与えないウィジェットが、「空」を返します。 (getElementsByTagNameのようなものと一緒に使用のブラウザでJavaScriptの基本的な方法は、)のinnerTextとのTextContentは完全に(または全くない)ヤフーに実装されていません。ウィジェットエンジンと、それが遅くなると、かなりひどくXMLNodeのとのchildNodesに反応します。しかし、XML文書構造をトラバースする簡単な方法は、XMLから(ノードのリストを含む)あなたが必要なすべてを取得するために「評価」を使用してされます。

このアウトを見つけた後、私の解決策は非常に簡単かつ障害やエラーにあまり敏感にすべてを作ることでした。また、私は彼らと簡単に作業を行うために、配列内のオブジェクトを置くことにしました。

            var entries = xmlDoc.evaluate("lfm/recenttracks/track");
            var length = entries.length;
            for(var i = 0; i &lt; length; i++) {
                var entry = entries.item(i);
                var obj = {
                    artist: entry.evaluate("string(artist)"),
                    name: entry.evaluate("string(name)"),
                    url: entry.evaluate("string(url)"),
                    image: entry.evaluate("string(image[@size='medium'])")
                    };
                posts[i] = obj;
            }

他のヒント

テスト「2」ノードはそのデータにアクセスする前に子ノードを持っていること。

childNodes.item(I)(またはJavaScriptの単純な形式のchildNodes [i]が)一般的には正確な予想される場所にある空白のテキストノードに依存するビット脆弱だ、避けるべきである。

私のような何かをしたいです

var tracks= xmlDoc.getElementsByTagName('track')[0];
var track= tracks.getElementsByTagName('one')[0];
var info= track.getElementsByTagName('two')[0];
var value= info.firstChild? info.firstChild.data : '';

(あなたは事前に「1」と「2」のタグ名がわからない場合、あなたは常に限り、あなたがサポートする必要がないよう、すべての要素を取得するには「getElementsByTagNameの(」*「)」を使用することができますこれは動作しませんIE5、。)

最後の行に代わるものは、その子ノードのいずれかを含むノード内のすべてののテキストを、を読み取るための方法を使用することです。これは、ノードが唯一のこれまでで最も1つのテキストノードに含まれている場合は問題ありませんが、ツリーがdenormalisedまたはEntityReferencesがまたはネストされた要素を含む得ることができる場合に役立ちます。歴史的に1は、この情報を取得するために再帰メソッドを記述しなければならなかったが、これらの日、ほとんどのブラウザは、DOMレベル3のTextContentプロパティおよび/またはIEののinnerText拡張をサポートします:

var value= info.textContent!==undefined? info.textContent : info.innerText;

なdtdとが可能 一つ 要素を含んでいる空 二つの 要素までを解析し、怒のテキストのxmlを文書です。

Empty要素はnullの値がデータベースに入れても、"なんでもない"または"0"価値、非破れの空間のなか、あらゆるものすべてまたはを含めないでください 二つの 要素になります。

かき 属性一つ, な要素です。Attributesが空の文字列を数値です。よりよいよファントムです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top