2010-07-16 61 views
0

我有一个从其他网站接收XML的页面,所以我无法控制XML。它正在返回一个帐户列表。具体来说,QuickBooks帐户。这些帐户可以有孩子。但是,没有“有孩子”属性,只有“有父母”属性。换句话说,如果你看一个账户,你可以知道它有一个父母,但如果它有任何孩子,你就没有理想。显示包含子帐户的帐户列表?

下面是两个帐户的示例,其中一个是另一个的子帐户。

孩子:

<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中的时尚?

Ex。

  • 银行西 - MMA
    • 物业税储备
  • 父项目
    • 孩子1
    • 孩子2

等。

回答

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> 

注意:“Accounts”是本例中的根节点。您没有指定您的根节点名称。 编辑︰更改变量名称的清晰度

+0

虽然“孩子们”实际上并不是xml孩子。正如你所看到的,“财产税储备”实际上并不是“西方银行--MMA”的XML孩子。从XML的角度来看,它实际上是一个兄弟姐妹。 – Jimmy 2010-07-16 20:39:52

+0

确实如此,但从名单上来看,他们是孩子。它没有解决你的问题吗? – jarofclay 2010-07-16 20:58:19

+0

没有。当我复制你的代码时,我得到的输出是“

    ”。我不明白“XmlSearch(xmlDoc,”/ Accounts/Account [not(AccountParentName)]“)”部分。那应该是什么? – Jimmy 2010-07-16 21:28:14

    0

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

    仅仅因为XML是交换格式并不意味着你必须以这种方式工作。你让数据格式,你不控制,控制你如何显示数据。