ColdFusion - 处理两个同步XML查询的结果?

时间:2012-08-04 23:33:03

标签: xml arrays loops coldfusion struct

我需要建立一个页面,列出每个委员会成员的特定委员会,他们的位置,他们的电子邮件和电话号码。此数据通过XML Webservice公开。一个表包含委员会数据(成员名称,位置),另一个表包含个人数据(电子邮件,电话)。我尝试使用连接在单个查询中获取数据,但API显然不支持。它确实提供了一个“MultiQuery”方法,允许运行大量离散查询,这就是我正在使用的。

我之前问了一个similar question,它实际上使用了相同的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>

我将此代码放在struct creator的末尾,就在循环结束之前。我不明白结果,因为它在阵列中放置了超过8500个结构。有些结构没有条目,有些是部分结构,有些是先前的重复,有些有一个官员的电子邮件,另一个是电话 - arrgghh!我试图做的是,对于循环的每次迭代,测试我的页面需要的键/值对的存在,将它们添加到新创建的结构中,并将结构添加到现有数组。

我正在使用的XML结果确实有数千行,但只有10名官员。我不确定为什么要创建8500个奇怪的结构 - 除非存在键“aName”,否则不应该将结构添加到数组中,除非在任何给定的传递中定义#memberName#的值,否则不应该发生该结构。环。创建的任何结构应该只包含我分配给它的键/值对。

但这根本不是发生的事情。我很确定我这样做比实际上更复杂,但它真的让我难过。我会非常感谢任何提示,建议,建议和指示 - 非常感谢你们提前帮助我们!

1 个答案:

答案 0 :(得分:0)

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

第一个信封查询委员会信息(成员名称,ID,位置)并在结果XML上循环以加载多维数组,然后将其保存为会话var。然后带我到另一个页面,在那里我获得个人数据(来自第二个表,电子邮件,电话的ID),并创建第二个多维数组。

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

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