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>

我觉得你i在变量名中使用了两次很奇怪,但我不熟悉 Youtube API,所以也许这是正确的。

我已经更改了您代码中不需要的两件事。我删除了额外的##符号,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 回答
0

一年过去了,我终于找到了答案。它将对其他人有用。我在下面得到了最终的工作代码。

<cfhttp url="https://gdata.youtube.com/feeds/api/users/Shuggy23/favorites" method="get" result="YouTube">   
            </cfhttp>
            <cfset xml = xmlParse(#YouTube.FileContent#) />

            <cfset media = XmlSearch(xml, "//media:group/") />
            <cfloop index="i" from="1" to="8">
                <cfoutput>
                    #media[i]['media:thumbnail'].XmlAttributes['url']# <br />
                </cfoutput>
            </cfloop>

干杯,

道格拉斯

于 2014-03-19T14:56:19.093 回答