3

私はこれに対する解決策を見つけるのに本当に苦労しています。私のコードは、Google 検索で見たものとは異なり、私が試したものは何も機能しません。基本的に、タイトルが示すように、Xml ノードが存在するかどうかを確認したいと思います。これは、YouTube フィードから返される不規則な XML が原因です。コードは以下です。

<cfset YouTubeXml = xmlParse(#YouTubeFavourites.FileContent#) />
<cfset group = XmlSearch(YouTubeXml, "//media:group") />    

<cfloop from="1" to="25" index="i">
    <cfoutput>
        #group[i]['media:thumbnail'][i]['url']#
    </cfoutput>
</cfloop>

基本的に、エラーはそれ#group[i]['media:thumbnail'][i]['url']#が存在しないと言います。誰かが助けてくれることを願っています。

4

4 に答える 4

5

以下のコードは、変数を表示する前に変数が存在することを確認します。ネストされたアプローチは、進行中に各ピースが確実に存在するようにする唯一の方法です。見た目を美しくする機能はありますが、それは別の質問のトピックです。

<cfset YouTubeXml = xmlParse( YouTubeFavourites.FileContent ) />
<cfset group = XmlSearch( YouTubeXml, "//media:group" ) />

<cfoutput>
<cfloop from="1" to="25" index="i">
    <cfif StructKeyExists( Group, i )
        AND StructKeyExists( Group[ i ], 'media:thumbnail' )
        AND StructKeyExists( Group[ i ][ 'media:thumbnail' ], i )
        AND StructKeyExists( Group[ i ][ 'media:thumbnail' ][ i ], 'url' )>
        #group[i]['media:thumbnail'][i]['url']#
    </cfif>
</cfloop>
</cfoutput>

変数名に 2 回使用されているのは奇妙ですがi、Youtube API に詳しくないので、正しいかもしれません。

あなたのコードで不要なものを 2 つ変更しました。すでに変数として扱われるため、余分な##記号を削除しました。また、複数回宣言するとパフォーマンスがわずかに低下するため、ループxmlParse()の外に移動しました。<cfoutput><cfoutput>

于 2013-03-12T12:52:17.477 に答える
2

使ってみてくださいisDefined()

<cfset YouTubeXml = xmlParse(YouTubeFavourites.FileContent) />
<cfset group = XmlSearch(YouTubeXml, "//media:group") />

<cfloop from="1" to="25" index="i">
<cfif isDefined("#group[i]['media:thumbnail'][i]['url']#")>
    <cfoutput>
        #group[i]['media:thumbnail'][i]['url']#
    </cfoutput>
</cfif>
</cfloop>
于 2013-03-12T13:17:09.723 に答える
0

さて、ここでいくつかのことが混同されています。まず第一に、xmlSearch関数は常に配列を返すため、structKeyExists提案どおりに関数を使用すると、当然例外がスローされます。次に考慮すべきことは、ソース XML に名前空間が含まれているかどうかです。その場合は、XPath 用語を指定する必要があります"//:media:group"(これは ColdFusion 自体による奇妙な実装です)。

<cfset group = xmlSearch(YouTubeXml, "//:media:group")>
<cfif not arrayIsEmpty(group)>

    <cfloop array="#group#" index="xmlNode">
        <cfif structKeyExists(xmlNode, "url")>
            <cfoutput>#xmlNode.url.xmlText#</cfoutput>
        </cfif>
    </cfloop>

<cfelse>
    <cfoutput>The XML does not contain the desired nodes.</cfoutput>
</cfif>

ただし、例のコードは、XPath で検索しているノード内の別の配列を想定しているようです。結果ノードの内部 XML でさらにノードにアクセスする必要がある場合は、事前に XPath 用語を変更して子ノードを取得するか、ループ内の結果ノードで別の XPath 検索を実行する必要があります。ColdFusion は、子ノードをその親に配列として自動的に割り当てません。

これがうまくいかない場合は、XML の例を投稿してください。

于 2013-03-13T00:37:48.933 に答える