1

我需要建立一个页面,列出给定委员会的每个委员会成员、他们的职位、他们的电子邮件和电话号码。此数据通过 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# 的值,否则不应发生环形。创建的任何结构都应该只包含我分配给它的键/值对。

但这根本不是正在发生的事情。我很确定我让这种方式比实际上更复杂,但它真的让我难过。我将非常感谢任何提示、建议、建议、指点——非常感谢你们的帮助!

4

1 回答 1

0

如果有人感兴趣,我通过在两个不同页面上将包含查询的 SOAP 信封分成两部分来获得一个可行的解决方案。

第一个信封查询委员会信息(成员姓名、ID、职位)并遍历生成的 XML 以加载多维数组,然后将其保存为会话变量。然后将我带到另一个页面,在那里我获取个人数据(来自第二个表的 ID、电子邮件、电话),并创建了第二个多维数组。

每个表都以不同的顺序输出其信息(当然),所以我然后遍历两个数组并根据 ID 对它们进行排序。然后我再次循环它们以输出到页面。

我最终得到了一个很好的姓名、职位、电子邮件和电话号码的列表。它有效,但多么令人头疼!当然有更好的方法来做到这一点......

于 2012-08-06T17:06:59.817 回答