显示具有子帐户的帐户列表?

时间:2010-07-16 19:26:31

标签: xml coldfusion

我有一个从另一个网站接收xml的页面,所以我无法控制xml。它返回一个帐户列表。具体来说,QuickBooks帐户。这些帐户可以有孩子。但是,没有“has child”属性,只有“has parent”属性。换句话说,如果你看一个帐户,你可以告诉它有一个父母,但如果它有任何孩子你就没有理想。

以下是两个帐户的示例,一个是另一个帐户的子项。

孩子:

<Account> 
  <Id idDomain="QB">288</Id> 
  <SyncToken>1</SyncToken> 
  <MetaData> 
    <CreatedBy>app</CreatedBy> 
    <CreatedById>1</CreatedById> 
    <CreateTime>2010-06-16T21:47:58.0Z</CreateTime> 
    <LastModifiedBy>app</LastModifiedBy> 
    <LastModifiedById>1</LastModifiedById> 
    <LastUpdatedTime>2010-06-16T21:47:58.0Z</LastUpdatedTime> 
  </MetaData> 
  <ExternalKey idDomain="QB">288</ExternalKey> 
  <Synchronized>true</Synchronized> 
  <Name>Property Tax Reserve</Name> 
  <AccountParentId idDomain="QB">272</AccountParentId> 
  <AccountParentName>Bank of the West - MMA</AccountParentName> 
  <Active>true</Active> 
  <Type>Asset</Type> 
  <Subtype>Bank</Subtype> 
  <CurrentBalance>0</CurrentBalance> 
</Account> 

父母:

<Account> 
  <Id idDomain="QB">272</Id> 
  <SyncToken>1</SyncToken> 
  <MetaData> 
    <CreatedBy>app</CreatedBy> 
    <CreatedById>1</CreatedById> 
    <CreateTime>2009-03-19T21:34:22.0Z</CreateTime> 
    <LastModifiedBy>app</LastModifiedBy> 
    <LastModifiedById>1</LastModifiedById> 
    <LastUpdatedTime>2009-03-19T21:34:22.0Z</LastUpdatedTime> 
  </MetaData> 
  <ExternalKey idDomain="QB">272</ExternalKey> 
  <Synchronized>true</Synchronized> 
  <Name>Bank of the West - MMA</Name> 
  <Active>true</Active> 
  <Type>Asset</Type> 
  <Subtype>Bank</Subtype> 
  <CurrentBalance>4625.93</CurrentBalance> 
</Account> 

因此,在一堆帐户(无特定顺序)的列表中,我将如何循环以在ColdFusion中以分层方式显示它们?

实施例

  • 西方银行 - MMA
    • 物业税储备
  • 父项
    • child 1
    • child 2

等。

2 个答案:

答案 0 :(得分:1)

假设您的帐户都在同一个XML文件中,您可以使用XPath查找父母和子女。

<cfscript>
xmlDoc=XMLParse("yourfile.xml");
listParents = XmlSearch(xmlDoc, "//Account[not(AccountParentName)]");
writeoutput("<ul>");
for (i = 1; i LTE ArrayLen(listParents); i = i + 1) {
    writeoutput("<li>" & listParents[i].Name.XmlText);
    listChildren = XmlSearch(xmlDoc, "//Account[AccountParentId=#listParents[i].Id.XmlText#]");
    if(ArrayLen(listChildren)) {
        writeoutput("<ul>");
        for (i = 1; i LTE ArrayLen(listChildren); i = i + 1) {
            writeoutput("<li>" & listChildren[i].Name.XmlText);
        }
        writeoutput("</ul>");
    }
    writeoutput("</li>");

}
writeoutput("</ul>");
</cfscript>

注意:“帐户”是此示例中的根节点。您没有指定根节点名称。 编辑:为清晰起见更改了变量名称

答案 1 :(得分:0)

我不会在一次通过中尝试这样做。相反,我会处理XML并将其放入关系数据库,甚至只需将XML转换为合理的json并将其存储在MongoDB中。然后,您可以根据需要查询它,并使用熟悉的数据结构处理数据。

仅仅因为XML是交换格式并不意味着你必须以这种方式使用它。您要让您无法控制的数据格式控制显示数据的方式。