2010-07-16 5 views
0

J'ai une page qui reçoit xml d'un autre site web, donc je n'ai aucun contrôle sur le xml. Il retourne une liste de comptes. Plus précisément, les comptes QuickBooks. Ces comptes peuvent avoir des enfants. Cependant, il n'y a pas d'attribut "has child", seulement un attribut "has parent". En d'autres termes, si vous regardez un compte, vous pouvez dire qu'il a un parent, mais vous n'auriez pas d'idead s'il avait des enfants.Afficher la liste des comptes avec sous-comptes?

Voici un exemple de deux comptes, un enfant de l'autre.

L'enfant:

<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> 

Le parent:

<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> 

Ainsi, dans une liste d'un groupe de comptes (sans ordre particulier) comment pourrais-je boucle à travers les afficher dans une hiérarchie mode dans ColdFusion?

Ex.

  • Bank of the West - MMA
    • réserve de l'impôt foncier
  • Parent Item
    • enfant 1
    • enfant 2

Répondre

1

En supposant que vos comptes proviennent tous du même fichier XML, vous pouvez utiliser XPath pour trouver les parents et les enfants.

<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> 

Remarque: "Comptes" est votre noeud racine dans cet exemple. Vous n'avez pas spécifié le nom de votre noeud racine. Editer: Changement de noms de variables pour plus de clarté

+0

Cependant, les "enfants" ne sont pas réellement des enfants xml. Comme vous pouvez le voir, "Réserve d'impôts fonciers" n'est pas un enfant XML de "Bank of the West - MMA". Du point de vue de XML, c'est en réalité un frère ou une soeur. – Jimmy

+0

Vrai, mais dans le sens de la liste, ils sont des enfants. Cela n'a-t-il pas résolu votre problème? – jarofclay

+0

Non. la sortie que j'ai eu était "

    " lorsque j'ai copié votre code. Je ne comprends pas la partie "XmlSearch (xmlDoc,/Accounts/Account [not (AccountParentName)]") ". Qu'est-ce que c'est censé attraper? – Jimmy

    0

    Je ne tenterais pas de le faire en un seul passage. Au lieu de cela, je traiterais le XML et le mettrais dans une base de données relationnelle ou même transformerais simplement le XML en JSON sensé et le stockerais dans MongoDB. Ensuite, vous pouvez l'interroger comme vous le souhaitez et travailler avec les données avec des structures de données familières. Ce n'est pas parce que XML est le format d'échange que vous devez travailler de cette façon. Vous laissez le format de données, que vous ne contrôlez pas, contrôler la façon dont vous affichez les données.

    Questions connexes