2013-03-12 1 views
2

Я действительно пытался найти решение этого. Мой код отличается от того, что я видел в поиске Google, и ничего, что я пробовал, будет работать. В основном, как указано в заголовке, я хочу проверить, существует ли Xml-узел. Это происходит из-за ошибочного XML, возвращаемого из фида YouTube. Код ниже.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 дважды в имени переменной, но я не знаком с API Youtube, поэтому возможно, что это правильно.

Я изменил две вещи в вашем коде, которые не были нужны. Я удалил лишние знаки ## в xmlParse(), поскольку он уже будет рассматриваться как переменная. Я также переместил <cfoutput> из цикла, так как есть небольшая потеря производительности, объявляющая <cfoutput> несколько раз.

+0

Спасибо за Ваш ответ. Вы бы подумали, что это сработает, но я продолжаю получать ошибку «Параметр не типа STRUCTURE». – Douglas

+0

@DouglasMcGregor какая строка указывает на эту ошибку? Возвращена ли группа как структура? –

+0

Указывает на строку 12, которая является оператором . – Douglas

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

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> 

Cheers,

Douglas