2012-08-04 73 views
1

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

但这并不是所发生的一切。我很确定我正在使这种方式比实际情况更复杂,但它确实让我难堪。我会大大欣赏任何提示,建议,建议,指针 - 非常感谢你所有提前的帮助!

+0

只有一半人读过这个,但听起来你需要一个''''ArrayAppend'(仍然在cfif里面)重新设置结构,否则旧数据会在周围发生并导致奇怪。 (此外,您不需要结构定义中的散列。) – 2012-08-06 23:43:05

回答

0

如果有人有兴趣,我可以通过将包含查询的SOAP信封分为两部分,在两个不同的页面上得到一个工作解决方案。

第一个信封查询委员会信息(成员名称,ID,位置),并在生成的XML上循环加载多维数组,然后将其保存为会话变量。然后带我到另一个页面,我从中获取单个数据(第二个表,电子邮件,电话的ID),并创建第二个多维数组。

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

我最终列出了一张名字,位置,电子邮件和电话号码。它有效,但是很头疼!当然,还有更好的方法可以做到这一点...