ColdFusion - jak zapętlić wyjście XML i dodać do struct lub array?

Próbuję stworzyć listę urzędników i ich odpowiednich stanowisk. Dane pochodzą z serii par kluczy / wartości XML, do których dostęp można uzyskać za pośrednictwem usługi sieciowej (klucz: nazwa_użytkownika, wartość: członek Joe. Klucz: nazwa_pozycji, wartość: prezes i tak dalej). Każdy oficer dla danego rozdziału ma własną nazwę użytkownika i Nazwa_pozycji.

Interfejs API, z którym pracuję, zwróci tylko cały obiekt, więc utworzyłem tablicę do konwersji nazwy XML i przechowującą wszystko:

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

Moja myśl polegała na przejściu przez tę tablicę, a dla każdej instancji kluczowej nazwy użytkownika i nazwy pozycji dodaj wartości do struktury:

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

Zrzucenie tej struktury daje mi ładny zgrabny mały stolik z imieniem jednej osoby, pozycją tej osoby i ich terminem - ale tylko ten (który jest ostatnim wpisem w pliku XML). Nawet dodanie i = i + 1 nie ma żadnego efektu - jest prawie tak, jakby pętla zaczynała się na końcu i nie kontynuowała.

Próbowałem innych sposobów dodawania rzeczy do struktury, którerobi przeglądać wszystko, ale pary klucz / wartość wychodzą w niepowiązanej kolejności. Wiem, że i tak nie są uporządkowane struktury, ale muszę mieć jakiś sposób na sekwencjonowanie danych z wyjścia XML. Próbowałem też różnych innych pętli, próbując dodać serię małych struktur, takich jak ta, do tablicy. Zadziałało, ale znowu, tylko dla tej jednej osoby - wydawało się, że nie ma rzeczywistej „pętli”! Widzę wszystkie potrzebne informacje w tym samym czasie - więc może wszystko po to, żeby zrobić coś złego?

Dziękuję wszystkim z góry, doceniam wszelkie sugestie lub działania we właściwym kierunku!

AKTUALIZACJA: nie wiem, czy to pomaga, ale właśnie teraz zamieniłem wartości To i Od w pętli, której używam, i ustawiłem krok na -1, co dało mi PIERWSZĄ osobę na liście. Ale nadal nie zapętliłem.

UPDATE: Dzięki Peter, oto przykład XML, z którym pracuję:

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

Powtórzenia dla każdego oficera rozdziału w aktach.

AKTUALIZACJA: oto kod, który wymyśliłem. Robi to, co chcę, ale jest wiele lepszych sposobów, by to zrobić, jestem pewien ...

Najpierw otrzymuję wyniki odpowiedzi SOAP, „drążę w dół” do poziomu, którego potrzebuję, a następnie usuwam elementy specyficzne dla xml i wprowadzam dane do użytecznej tablicy:

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

Następnie

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

Wykonuję inne przetwarzanie, sprawdzam, czy istnieją zmienne itp., A następnie wypisuję nazwiska oficerów i ich odpowiednie pozycje

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

Udało mi się dodać Member_Guid do tablicy i użyć go, aby użytkownicy witryny mogli kliknąć na nazwisko osoby, aby zobaczyć więcej szczegółów (firma, adres e-mail itp.). I o to chodzi! Co myślisz? Jeszcze raz dziękuję za poświęcenie czasu, naprawdę to doceniam!

questionAnswers(2)

yourAnswerToTheQuestion