1

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>

「2」ノードには値がないため、ウィジェットは 2 番目の「1」ノードでクラッシュします。コンソールには次のように表示されます。

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

クラッシュするのではなく、空の文字列 (null、空、または "") としてウィジェットを表示する方法についてのアイデアはありますか? datagetValue()text、またはその他の行に沿って何かを推測しています。

使用して

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

動作せず、「TypeError: track has no properties」を返します。それはアーティストが呼ばれる 2 行目からです。

4

3 に答える 3

1

データにアクセスする前に、「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 : '';

(「one」と「two」のタグ名が事前にわからない場合は、IE5 をサポートする必要がない限り、いつでも「getElementsByTagName('*')」を使用してすべての要素を取得できます。これは機能しません。)

最後の行に代わる方法は、メソッドを使用して、子ノードを含むノード内のすべてのテキストを読み取ることです。これは、ノードに含まれる Text ノードが 1 つだけであるかどうかは問題ではありませんが、ツリーが非正規化されるか、EntityReferences またはネストされた要素を含む場合に役立ちます。歴史的には、この情報を取得するには再帰メソッドを記述する必要がありましたが、最近ではほとんどのブラウザーが DOM レベル 3 の textContent プロパティおよび/または IE の innerText 拡張機能をサポートしています。

var value= info.textContent!==undefined? info.textContent : info.innerText;
于 2009-03-23T00:31:02.593 に答える
0

1つの要素に空の2つ要素を含めることができるdtdがない場合は、xmlのテキストを解析してフィドルし、ドキュメントを取得する必要があります。

空の要素は、データベースのnull値のようなものです。何か、「Nothing」または「0」の値、ノーブレークスペースなどを入力するか、2つの要素を含めないでください。

多分それはそれ自体の要素ではなく、1つの属性である可能性があります。属性には、値に空の文字列を含めることができます。ファントム要素よりも優れています。

于 2009-03-23T01:30:30.623 に答える
0

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

使用する代わりに:

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

値を取得するには、文字列への直接変換で Xpath を使用することをお勧めします。Yahoo! で文字列が空の場合 ウィジェットは何の障害も与えませんが、「空」を返します。yahoo! Widgets Engine を変更して実行速度を遅くし、xmlNodes と childNodes への反応が非常に悪くなります。ただし、xml ドキュメント構造をトラバースする簡単な方法は、'evaluate' を使用して、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;
            }
于 2009-03-27T15:30:41.400 に答える