我需要建立一个页面,列出给定委员会的每个委员会成员,他们的职位,他们的电子邮件和电话号码。这些数据通过XML webservice公开。一个表格包含委员会数据(会员名称,职位),另一个表格包含个人数据(电子邮件,电话)。我尝试使用连接在单个查询中获取数据,但API显然不支持这一点。它确实提供了一种“MultiQuery”方法,可以运行多个不连续的查询,所以这就是我正在使用的方法。ColdFusion - 处理来自两个同时XML查询的结果?
我之前问过一个similar question,实际上它使用相同的XML和相同的常规设置。彼得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>
其中一期工程非常适合单个成员。倾销“章节职员”给我我需要的一切。我的想法是建立一堆结构的每个官员,并放置在一个数组,chapterOfficers,我会然后依次通过建立我的页面:
<cfif structKeyExists(chapterOfficer, "aName")>
<cfset arrayAppend(chapterOfficers, chapterOfficer)>
</cfif>
我把这个代码在随后结束的结构创造者,就在循环结束之前。我不理解结果,因为它将8500个结构放在阵列中。一些结构没有条目,有些是部分条目,有些是重复以前的条目,有些有一个官员的电子邮件,另一个是电话 - arrgghh!我试图做的是,对于循环的每次迭代,测试我的页面所需的键/值对的存在性,将它们添加到新创建的结构中,然后将该结构添加到现有数组中。
在我正在使用的XML结果中确实有成千上万行,但只有10名官员。我不确定为什么会创建8500个奇怪的结构 - 除非存在关键字“aName”,否则不应该将结构添加到数组中,除非在给定的任何给定的pass上定义了#memberName#的值,否则不应该发生该结构循环。任何创建的结构应该只包含我分配给它的键/值对。
但这并不是所发生的一切。我很确定我正在使这种方式比实际情况更复杂,但它确实让我难堪。我会大大欣赏任何提示,建议,建议,指针 - 非常感谢你所有提前的帮助!
只有一半人读过这个,但听起来你需要一个' '''ArrayAppend'(仍然在cfif里面)重新设置结构,否则旧数据会在周围发生并导致奇怪。 (此外,您不需要结构定义中的散列。) –
2012-08-06 23:43:05