我正在尝试创建分会官员及其各自职位的列表。数据来自通过 Web 服务访问的一系列 XML 键/值对(键:Member_Name,值:Joe Member。键:Position_Name,值:总统,等等。)给定章节的每个官员都有自己的 Member_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 也没有任何效果——这几乎就像循环从最后开始,而不是继续。
我尝试了其他向结构添加内容的方法,它确实循环遍历所有内容,但键/值对以不相关的顺序出现。我知道结构无论如何都没有排序,但我需要有一些方法来对 XML 输出中的数据进行排序。我还尝试了各种其他循环,尝试将一系列像这样的小结构添加到数组中。它起作用了,但同样,只针对那个人——似乎没有发生实际的“循环”!我可以同时看到我需要的所有信息——所以也许是为了让我做错事?
提前谢谢大家,我很感激任何正确方向的建议或推动!
更新:不知道这是否有帮助,但刚才我在我正在使用的循环中交换了 To 和 From 的值,并将 step 设置为 -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 添加到数组中并使用它,以便站点访问者可以单击一个人的姓名以查看更多详细信息(公司、电子邮件地址等)。就是这样!你怎么看?再次,非常感谢您抽出宝贵的时间,我真的很感激!