我需要建立一个页面,列出给定委员会的每个委员会成员、他们的职位、他们的电子邮件和电话号码。此数据通过 XML Web 服务公开。一张表包含委员会数据(成员姓名、职位),另一张表包含个人数据(电子邮件、电话)。我尝试使用连接在单个查询中获取数据,但 API 显然不支持。它确实提供了一个“MultiQuery”方法,允许运行许多离散查询,所以这就是我正在使用的。
我之前问过一个类似的问题,它实际上使用了相同的 XML 和相同的常规设置。Peter Boughton 和其他人非常有帮助,他们的建议非常有效。当时和现在的区别是,那时我只需要委员会的数据。现在我需要委员会和个人数据,而这正是我所困的地方。
两个查询的结果分为两个部分——一个对象,但两个“ArrayOfanyType”部分。两个“部分”都被分解并包含在一个数组中:
<cfset keyValue = xmlSearch(soapBody,"//*[local-name()='KeyValueOfstringanyType']") />
我可以使用蛮力方法循环遍历此数组以将数据添加到结构:
<cfloop index="i" from="1" to="#arrayLen(keyValue)#">
<cfif keyValue[i].Key.xmlText EQ 'Member_Name'>
<cfset memberName = keyValue[i].Value.xmlText>
</cfif>
<cfif keyValue[i].Key.xmlText EQ 'Position_Name'>
<cfset positionName = keyValue[i].Value.xmlText>
</cfif>
<cfif keyValue[i].Key.xmlText EQ 'Member_Guid'>
<cfset memberGuid = keyValue[i].Value.xmlText>
</cfif>
<cfif keyValue[i].Key.xmlText EQ 'Employer__c'>
<cfset employer = keyValue[i].Value.xmlText>
</cfif>
<cfif keyValue[i].Key.xmlText EQ 'Primary_EmailAddress_EmailAddress'>
<cfset email = keyValue[i].Value.xmlText>
</cfif>
<cfif keyValue[i].Key.xmlText EQ '_Default_PhoneNumber_PhoneNumber'>
<cfset phone = keyValue[i].Value.xmlText>
</cfif>
<cfset chapterOfficer = {
aName = #memberName#,
bPositionName = #positionName#,
cMemberGuid = #memberGuid#,
dCompany = #employer#,
eEmail = #email#,
fPhone = #phone#
} />
</cfloop>
这对单个成员很有用。倾倒“chapterOfficer”给了我我需要的一切。我的想法是为每个官员构建一堆结构并将它们放在一个数组中,chapterOfficers,然后我将循环通过它来构建我的页面:
<cfif structKeyExists(chapterOfficer, "aName")>
<cfset arrayAppend(chapterOfficers, chapterOfficer)>
</cfif>
我将这段代码放在结构创建者的末尾,就在循环结束之前。我不明白结果,因为它在数组中放置了 8500 多个结构。有些结构没有条目,有些有部分条目,有些是以前的重复,有些有一个官员的电子邮件和另一个人的电话——啊!我试图做的是,对于循环的每次迭代,测试我的页面需要的键/值对是否存在,将它们添加到新创建的结构中,并将结构添加到现有数组中。
我正在使用的 XML 结果中确实有数千行,但只有 10 名官员。我不确定为什么要创建 8500 个奇怪的结构 - 除非键“aName”存在,否则不应将结构添加到数组中,除非在任何给定的传递中定义 #memberName# 的值,否则不应发生环形。创建的任何结构都应该只包含我分配给它的键/值对。
但这根本不是正在发生的事情。我很确定我让这种方式比实际上更复杂,但它真的让我难过。我将非常感谢任何提示、建议、建议、指点——非常感谢你们的帮助!