2016-04-20 4 views
2

J'utilise actuellement ColdFusion 10/11 et je suis encore relativement nouveau avec cette version. Je code normalement en PHP/C# donc le concept de l'utilisation d'un langage de script (si c'est ce que vous appelleriez), pour gérer les données en XML est un peu étrange pour moi. Si je pouvais reconcevoir l'application web en PHP, je le ferais malheureusement mais ce n'est pas une option pour le moment.Problème ColdFusion: lecture de la valeur de l'enfant XML en tant que chaîne vide

En ce qui concerne les plates-formes, je suis n'utilisant PAS Adobe ColdFusion Builder ou CF Administrator. J'utilise Dreamweaver et CFEclipse. Donc, maintenant je lis un fichier XML et je vérifie si l'enfant XML contient "oui", "non", etc. et affiche la balise correspondante. Cela a fonctionné correctement précédemment, mais je dois ajouter un nouvel enfant au fichier XML appelé "GNTrained". Après l'ajout du nouvel élément, il est toujours dit que la valeur est une chaîne vide. J'ai utilisé "structKeyExists" pour vérifier que l'enfant existe, mais la valeur est toujours vide. J'ai également vérifié qu'il lit le bon fichier XML. Les bonnes références de ColdFusion n'existent plus vraiment en ligne (même si je ne suis pas sûr qu'elles aient jamais existé), toute aide serait grandement appréciée!

Des idées pour lesquelles cela se produirait?
Partout ailleurs, l'emplacement XML serait délégué?

J'ai essayé plusieurs fois de le retravailler et je me demande toujours pourquoi la valeur est toujours une chaîne vide. J'ai essayé différentes valeurs, changé les éléments, tout et n'importe quoi pour que cela fonctionne. Par souci de mon travail, voici un exemple de code et non l'ensemble exact de code que j'utilise. Donc, si j'ai oublié quelque chose, s'il vous plaît faites le moi savoir. Cependant, c'est la version la plus simpliste du code et vraiment tout ce que je crois nécessaire pour résoudre ce problème.

Il existe 3 fichiers différents: le fichier d'affichage frontal, le fichier de requête et le fichier XML.

Voici le code de la page d'affichage:

<cfinclude template="#APPLICATION.root#employee/details/employee-query.cfm" /> 
<cfoutput> 
<cfquery name="get_employee" dbtype="query"> 
    SELECT id,name,GNTrained from session.employeeDetails order by name 
</cfquery> 
<cfloop query="get_employee"> 
<cfif tr eq "RowEven"> 
    <cfset tr="RowOdd"> 
    <cfelse> 
    <cfset tr="RowEven"> 
</cfif> 
<li class="EmployeeRow #tr#" id="company_#get_employee.currentrow#">#htmleditformat(get_employee.name)# 
    <div id="bfeat_#get_employee.currentrow#" class="Hidden"> 
     <div class="employeeGroup" style="width:371px;"> 
      <ul class="EmpTrainingList"> 
      <li>BBTrained: 
       <cfif get_employee.BBTrained contains "YES"> 
        <span class="yes">#get_employee.BBTrained#</span> 
       <cfelse> 
        <span class="no">#get_employee.BBTrained#</span> 
       </cfif> 
      </li> 
      <li>GNTrained: 
      <cfif structKeyExists(get_employee, "GNTrained")> 
       <span style="color: red;"><strong>EXISTS! </strong></span> 
       <cfelse> DOES NOT EXIST! 
      </cfif> 
      <cfif get_employee.GNTrained contains "YES"> 
        <span class="yes">#get_employee.GNTrained#</span> 
       <cfelseif get_employee.GNTrained contains "In Progress"> 
        <span class="in-progress">#get_employee.GNTrained#</span> 
       <cfelseif get_employee.GNTrained eq ""> 
        <span class="no">EMPTY</span>  
       <cfelse> 
        <span class="no">#get_employee.GNTrained#</span> 
      </cfif>    
      </li> 
      </ul> 
     </div> 
    </div> 
</li> 
</cfloop> 
</cfoutput> 

Voici le code pour la requête:

<cffile action="read" file="#ExpandPath('#application.root#cf_test/employeeDetails.xml')#" variable="myxml"> 

<cfset mydoc = XmlParse(myxml)> 
<cfset apps = mydoc.data.XmlChildren> 
<cfset size = ArrayLen(apps)> 

<cfset session.employeeDetails = QueryNew("employee_id,employee_name,GNTrained") > 
<cfset temp = QueryAddRow(session.employeeDetails, #size#)> 

<cfloop index="i" from = "1" to = #size#> 
    <cfloop index="x" from="1" to="8"> 
     <cfset attr_name = REReplace(#mydoc.data.employees[i].XMLChildren[x].xmlName#, "[^a-zA-Z0-9__]", "", "ALL") /> 
     <cfset temp = QuerySetCell(session.employeeDetails, "#attr_name#", 
      #mydoc.data.employees[i].XMLChildren[x].xmlText#, #i#)> 
    </cfloop>  
</cfloop> 

<cfcatch>Error loading</cfcatch> 
</cftry> 

</cfoutput> 

Voici le fichier XML:

<!---- File Name: employeeDetails.xml ----> 
<?xml version="1.0" encoding="utf-8" ?> 
<data> 
<employees> 
     <name>John Smith</name> 
     <id>1234</id> 
     <BBTrained>NO</BBTrained> 
     <DEPT>21</DEPT> 
     <EXP>12</EXP> 
     <current>YES</current> 
     <Status>ACTIVE</Status> 
     <StateCode>CO122</StateCode> 
     <GNTrained>NO</GNTrained> 
</employees> 
<employees> 
     <name>Mary Chapman</name> 
     <id>3344</id> 
     <BBTrained>YES</BBTrained> 
     <DEPT>21</DEPT> 
     <EXP>18</EXP> 
     <Status>LOA</Status> 
     <StateCode>DE255</StateCode> 
     <GNTrained>YES</GNTrained> 
</employees> 
<employees> 
     <name>Alex Fisher</name> 
     <id>6655</id> 
     <BBTrained>NO</BBTrained> 
     <DEPT>22</DEPT> 
     <EXP>6</EXP> 
     <Status>ACTIVE</Status> 
     <StateCode>ME255</StateCode> 
     <GNTrained>YES</GNTrained> 
</employees> 
</data> 

CODE MIS À JOUR - Inclut cfloop maintenant. (20/04/16)

** SOLUTION: ** Avec l'aide de SpliFF, j'ai été capable de trouver le problème. Sérieusement l'un des correctifs les plus faciles que j'ai rencontrés. Dans le code suivant sur la page de requête:

J'avais besoin de changer "8" à "9" pour expliquer le nouvel élément. Oui ... C'était vraiment ce petit changement.soupir

+0

Je ne sais pas je suis tout à fait, mais il semble que vous lisez un fichier XML, l'analyser et utiliser les données pour remplir un objet de requête. Si oui, où est le code qui remplit la requête avec des données? Le code ci-dessus crée un objet de requête et ajoute des lignes * vides *, c'est-à-dire "QueryAddRow (session.employeeDetails, # size #)" mais ne remplit pas ces lignes. – Leigh

+0

Oui, il semble que vous avez manqué la deuxième moitié de l'exemple dans la documentation: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6d1b.html. Vous devrez ajouter les fonctions 'cfloop' et' querySetCell' dans la boucle. – Chester

+0

J'ai ajouté plus de code qui montre le cfloop. Donc hypothétiquement, disons que BBTrained s'est montré correctement, mais pas GNTrained. Y a-t-il quelque chose qui le ferait apparaître ou apparaître comme une chaîne vide alors que clairement ce n'est pas vide? ... –

Répondre

2

Vous réglage avec température à la ligne 1 lorsque vous construisez votre requête parce que votre QueryAddRow est en dehors de la boucle. Vous en avez besoin pour pointer vers la ligne actuelle sur chaque enfant XML:

<cfloop index="i" from = "1" to = #size#> 
    <cfset temp = QueryAddRow(session.employeeDetails)> 
    <cfloop index="x" from="1" to="#ArrayLen(mydoc.data.employees[i].XMLChildren)#"> 
     <cfset attr_name = REReplace(#mydoc.data.employees[i].XMLChildren[x].xmlName#, "[^a-zA-Z0-9__]", "", "ALL") /> 
     <cfset QuerySetCell(session.employeeDetails, "#attr_name#", 
      #mydoc.data.employees[i].XMLChildren[x].xmlText#, #i#)> 
    </cfloop> 
</cfloop> 
+0

Aussi fou que cela puisse paraître, votre réponse m'a amené à trouver le problème. J'ai réussi à le faire fonctionner! Le problème était en fait qu'il était en boucle de = "1" à "8" mais le nouvel élément l'augmenterait de "8" à "9". En fait, je n'ai pas besoin de l'étiquette de temp avec ce que je fais actuellement. En remontant dans cette boucle et en l'inspectant, j'ai pu trouver la solution, alors merci beaucoup !!! –

+0

@SpliFF - Au second coup d'œil, ils ajoutent toutes les lignes avant la boucle, ce qui est bien. Donc je ne sais pas pourquoi ça ne marche pas. Cela a bien fonctionné pour moi. (Edit) - Peu importe, ça l'explique. Comme je pensais, la valeur n'était pas vraiment peuplée ;-) – Leigh

+0

QueryAddRow renvoie juste le nombre de lignes dans la requête de sorte que la variable temp soit interchangeable avec i dans la boucle (en supposant que la requête n'avait pas de lignes avant le début de la boucle). Votre droit que vous pouvez préremplir les lignes tant que votre troisième paramètre à QuerySetCell est la ligne correcte. Mais indépendamment de l'utilisation de ArrayLen() est le correctif réel dans ce cas (et plus sûr). – SpliFF