2010-07-16 66 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是交換格式並不意味着你必須以這種方式工作。你讓數據格式,你不控制,控制你如何顯示數據。