我一直在努力寻找解决方案。我的代码与我在Google搜索中看到的不同,我尝试过的任何内容都无法使用。基本上标题建议我想检查是否存在Xml节点。这是因为从YouTube Feed返回的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']#
不存在。希望有人可以提供帮助。
答案 0 :(得分:4)
下面的代码将检查以确保变量在尝试显示之前存在。嵌套方法是确保每个部分存在的唯一方法。有一些功能可以使它看起来更漂亮,但这是另一个问题的主题。
<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>
。
答案 1 :(得分: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>
答案 2 :(得分: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>
但是,您的exmaple代码似乎假设您正在通过XPath搜索的节点中的另一个数组。如果需要访问结果节点的内部XML中的其他节点,则需要先修改XPath术语以获取子节点,或者在循环中的结果节点上执行另一个XPath搜索。 ColdFusion不会将子节点自动分配给其父节点作为数组。
如果这对您不起作用,请发布XML示例。
答案 3 :(得分: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>
干杯,
道格拉斯