ColdFusion - как перебрать вывод XML и добавить его в структуру или массив?

Я пытаюсь составить список офицеров глав и их соответствующих должностей. Данные поступают из ряда пар ключ / значение XML, доступ к которым осуществляется через веб-сервис (ключ: имя_элемента, значение: член Джо. Ключ: имя_позиции, значение: президент и т. Position_Name.

API, с которым я работаю, будет возвращать только весь объект, поэтому я настроил массив для преобразования имени XML и хранения всего:

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

Моя мысль состояла в том, чтобы пройти через этот массив и для каждого экземпляра ключа Member_Name и Position_Name добавить значения в структуру:

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

Вывод этой структуры дает мне хороший аккуратный столик с именем одного человека, позицией этого человека и его термином - но только этим (который оказывается последней записью в файле XML). Даже добавление i = i + 1 не имеет никакого эффекта - почти как цикл начинается в конце, а не продолжается.

Я пробовал другие способы добавления вещей в структуру, которыеdoes все циклы, но пары ключ / значение выходят в несвязанном порядке. Я знаю, что структуры в любом случае не упорядочены, но мне нужен какой-то способ упорядочить данные из вывода XML. Я также пробовал различные другие циклы, пытаясь добавить серию маленьких структур, подобных этой, в массив. Это сработало, но опять же, только для этого человека - без фактического «зацикливания» казалось бы состоялось! Я могу видеть всю информацию, которая мне нужна, все одновременно, так что, может быть, это приводит все в порядок, что я делаю что-то не так?

Спасибо всем заранее, я ценю любые предложения или подталкивания в правильном направлении!

ОБНОВЛЕНИЕ: не знаю, помогает ли это, но сейчас я поменял значения «Кому» и «В» в цикле, который я использую, и установил шаг -1, и это дало мне ПЕРВОГО человека в списке. Но все равно не зациклился.

ОБНОВЛЕНИЕ: Спасибо, Питер, вот пример XML, с которым я работаю:

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

Повторяется для каждого офицера главы в файле.

ОБНОВЛЕНИЕ: вот код, который я придумал. Это делает то, что я хочу, но есть гораздо лучшие способы сделать это, я уверен ...

Сначала я получаю результаты из ответа SOAP, "развернуть" до необходимого мне уровня, а затем вычеркнуть материал, специфичный для xml, и получить данные в пригодный для использования массив:

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

затем

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

Я делаю некоторую другую обработку, проверяю наличие переменных и т. Д., А затем выводю имена офицеров и их соответствующие должности с

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

Мне удалось добавить Member_Guid в массив и использовать его, чтобы посетители сайта могли щелкнуть по имени человека, чтобы увидеть более подробную информацию (компания, адрес электронной почты и т. Д.). И это все! Как вы думаете? Еще раз, большое спасибо, что нашли время, я действительно ценю это!

Ответы на вопрос(2)

Ваш ответ на вопрос