Coldfusion - 检查XmlNode是否存在

时间:2013-03-12 12:41:39

标签: xml coldfusion bluedragon

我一直在努力寻找解决方案。我的代码与我在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']#不存在。希望有人可以提供帮助。

4 个答案:

答案 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>

干杯,

道格拉斯