2013-03-12 44 views
2

我一直在努力尋找解決方案。我的代碼與我在Google搜索中看到的代碼不同,並且我嘗試過的任何代碼都不會起作用。基本上如標題所示,我想檢查Xml節點是否存在。這是因爲從YouTube Feed返回的不規則XML。代碼如下。Coldfusion - 檢查XmlNode是否存在

<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

下面的代碼將在它試圖顯示它之前檢查以確保變量存在。嵌套的方法是確保每件作品一直存在的唯一方法。有些功能使它看起來更漂亮,但這是另一個問題的主題。

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

+0

感謝您的答覆。你可能會認爲這樣會工作,但我一直收到錯誤「Parameter is not of type STRUCTURE」。 – Douglas 2013-03-12 13:25:56

+0

@DouglasMcGregor該錯誤指向哪一行?小組是否作爲結構返回? – 2013-03-12 13:29:37

+0

它指向第12行,它是所有語句。 – Douglas 2013-03-12 13:36:18

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> 
+1

這是一個。它的工作原理是:) – PoeHaH 2013-07-01 11:42:17

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示例。

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> 

乾杯,

道格拉斯