ColdFusion - Wie durchläuft man die XML-Ausgabe und fügt sie zur Struktur oder zum Array hinzu?

Ich versuche, eine Liste der Chapter Officers und ihrer jeweiligen Positionen zu erstellen. Die Daten stammen aus einer Reihe von XML-Schlüssel / Wert-Paaren, auf die über den Webdienst zugegriffen wird (Schlüssel: Mitgliedsname, Wert: Joe-Mitglied. Schlüssel: Positionsname, Wert: Präsident usw.) Positionsname.

Die API, mit der ich arbeite, gibt nur ein gesamtes Objekt zurück. Daher habe ich ein Array eingerichtet, um den XML-Namen zu konvertieren und alles zu speichern:

<cfset keyValue = xmlSearch(soapBody,"//*[local-name()='KeyValueOfstringanyType']") />

Mein Gedanke war, dieses Array zu durchlaufen und für jede Instanz der Schlüssel Member_Name und Position_Name die Werte zu einer Struktur hinzuzufügen:

<cfset chapterOfficers=structNew()>
<cfloop index="i" from="1" to="#arrayLen(keyValue)#">
    <cfif keyValue[i].Key.xmlText EQ 'Member_Name'>
        <cfset chapterOfficers.Name=keyValue[i].Value.xmlText>
    </cfif>
    <cfif keyValue[i].Key.xmlText EQ 'Position_Name'>
        <cfset chapterOfficers.Position = keyValue[i].Value.xmlText>
    </cfif>
    <cfif keyValue[i].Key.xmlText EQ 'Term_Name'>
        <cfset chapterOfficers.Term = keyValue[i].Value.xmlText>
    </cfif>
</cfloop>

Wenn ich diese Struktur kopiere, erhalte ich eine nette kleine Tabelle mit dem Namen einer Person, der Position dieser Person und ihrem Begriff - aber nur dem einen (der zufällig der letzte Eintrag in der XML-Datei ist). Selbst das Hinzufügen von i = i + 1 hat keine Auswirkung - es ist fast so, als würde die Schleife am Ende beginnen und nicht fortgesetzt.

Ich habe andere Möglichkeiten ausprobiert, der Struktur Dinge hinzuzufügentut Durchlaufen Sie alles, aber die Schlüssel / Wert-Paare werden in einer unabhängigen Reihenfolge ausgegeben. Ich weiß, dass Strukturen sowieso nicht geordnet sind, aber ich muss eine Möglichkeit haben, die Daten aus der XML-Ausgabe zu sequenzieren. Ich habe auch verschiedene andere Schleifen ausprobiert und versucht, einem Array eine Reihe kleiner Strukturen wie diese hinzuzufügen. Es funktionierte, aber wieder nur für diese eine Person - es schien keine wirkliche "Schleife" zu geben! Ich kann alle Informationen, die ich benötige, gleichzeitig sehen. Vielleicht liegt es also daran, alles in Ordnung zu bringen, damit ich etwas falsch mache?

Vielen Dank im Voraus, ich freue mich über Vorschläge oder Anregungen in die richtige Richtung!

UPDATE: Ich weiß nicht, ob das hilft, aber gerade habe ich die Werte von To und From in der von mir verwendeten Schleife vertauscht und den Schritt auf -1 gesetzt, und es gab mir die ERSTE Person in der Liste. Hat aber trotzdem keine Schleife.

UPDATE: Danke Peter, hier ist ein Beispiel für das XML, mit dem ich arbeite:

<b:KeyValueOfstringanyType>
                    <b:Key>Member_Guid</b:Key>
                    <b:Value i:type="d:string">006e1c09-25f9-4178-86de-13c3e63200ce</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Member_Type</b:Key>
                    <b:Value i:type="d:string">Entity</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Member_Name</b:Key>
                    <b:Value i:type="d:string">Member, Joe</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Position_Guid</b:Key>
                    <b:Value i:type="d:string">02ae1c09-5779-4891-8cd1-05cf475cf5af</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Position_Type</b:Key>
                    <b:Value i:type="d:string">CommitteePosition</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Position_Name</b:Key>
                    <b:Value i:type="d:string">President</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Term_Guid</b:Key>
                    <b:Value i:type="d:string">044e1c09-a90b-495f-891f-afa13e653dee</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Term_Type</b:Key>
                    <b:Value i:type="d:string">CommitteeTerm</b:Value>
                 </b:KeyValueOfstringanyType>
                 <b:KeyValueOfstringanyType>
                    <b:Key>Term_Name</b:Key>
                    <b:Value i:type="d:string">2011-2012</b:Value>
                 </b:KeyValueOfstringanyType>

Wiederholungen für jeden Kapitelsachbearbeiter.

UPDATE: Hier ist der Code, den ich gefunden habe. Es macht das, was ich will, aber es gibt viel bessere Möglichkeiten, da bin ich mir sicher ...

Zuerst erhalte ich die Ergebnisse aus der SOAP-Antwort, "Drilldown" bis zu der von mir benötigten Ebene, dann entferne ich die XML-spezifischen Daten und füge sie in ein verwendbares Array ein:

<cfset soapBody = xmlParse(cfhttp.fileContent)>
<cfset soapBody = soapBody['s:Envelope']['s:Body'].QueryResponse.QueryResult.Objects.anyType.Fields />
<cfset keyValue = xmlSearch(soapBody,"//*[local-name()='KeyValueOfstringanyType']") />

Dann

<cfset chapterOfficers=arrayNew(2)>
<cfset x=1>
<cfset y=1>

<cfloop index="i" from="1" to="#arrayLen(keyValue)#">
    <cfif keyValue[i].Key.xmlText EQ 'Member_Name'>
        <cfset memberName = keyValue[i].Value.xmlText>
        <cfset chapterOfficers[x][y]=#memberName#>
        <cfset y=y+1>
    </cfif>
    <cfif keyValue[i].Key.xmlText EQ 'Position_Name'>
        <cfset positionName = keyValue[i].Value.xmlText>
        <cfset chapterOfficers[x][y]=#positionName#>
        <cfset x=x+1>
        <cfset y=1>
    </cfif>
    <cfif keyValue[i].Key.xmlText EQ 'Member_Guid'>
        <cfset memberGuid = keyValue[i].Value.xmlText>
        <cfset chapterOfficers[x][3]=#memberGuid#>
    </cfif>
</cfloop>

Ich führe eine andere Verarbeitung durch, überprüfe die Existenz von Variablen usw. und gebe dann die Namen der Offiziere und ihre jeweiligen Positionen mit aus

<cfloop from="1" to="#arrayLen(chapterOfficers)#" index="x">
    <p>
        <cfoutput><a href="OfficerDetail.cfm?sessionGuid=<cfoutput>#URL.sessionGuid#</cfoutput>&memberGuid=<cfoutput>#chapterOfficers[x][3]#</cfoutput>">#chapterOfficers[x][1]#</a></cfoutput><br />
        <cfoutput>#chapterOfficers[x][2]#</cfoutput><br />
    </p>
</cfloop>

Ich konnte Member_Guid zum Array hinzufügen und es verwenden, damit Site-Besucher auf den Namen einer Person klicken können, um weitere Details (Firma, E-Mail-Adresse usw.) anzuzeigen. Und das ist es auch schon! Was denkst du? Nochmals vielen Dank, dass Sie sich die Zeit genommen haben. Ich weiß das wirklich zu schätzen!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage