2012-02-09 3 views
1

Contexte de l'émission:Parsing gros fichier XML avec PHP avec imbrication non standard d'éléments (Fichier SAP Roadmap)

J'ai un dossier avec beaucoup de répertoires, fichiers, pièces jointes et JavaScript. Il existe un fichier core principal qui est traité par ActiveX pour générer une structure de type 'Tree JS' constituée d'une table imbriquée après une table imbriquée. Bref, c'est affreux.

Le problème que je me présente, est d'obtenir chargé dans une base de données afin de pouvoir appliquer les états au contenu associé.

analyse du fichier XML est pas nécessairement un problème pour moi, mais obtenir la structure à l'écoulement est correctement. Le fichier n'est pas imbriqué de manière logique, ce qui permet de créer facilement la structure dans la base de données/le système de fichiers. Le fichier XML est constitué de Structure nœuds qui contiennent un peu d'informations sur ce nœud et tout contenu pertinent dans le système de fichiers.

Je pensais le charger dans une structure de type MPTT, mais l'analyse syntaxique logiquement les différents noeuds dans ce qui se compose des relations enfants/parents est où je suis trébucher. Voici un exemple de ce fichier XML:

<Structure nodeid="9D565FD65DE9464EA36F005866DBF3AE" ParentID = "6EEB45ED97634C9BB2730D7713255673" IsAddOnNode="True" IsCoreNode = "0" > 
     <Name>POS specific remarks</Name> 
     <Sequence>1</Sequence> 
     <WBS>1.1.3.1</WBS> 
     <BackgroundColor>#80FF00</BackgroundColor> 
     <FontColor>Black</FontColor> 
     <Comments></Comments> 
     <References></References> 
    </Structure> 
    <Structure nodeid="A6F7E2F0728147BB88429545A6C490CA" ParentID = "B17AB99B64664624AAA41E220A9EAE59" IsAddOnNode="False" IsCoreNode = "0" > 
     <Name>Execution, Monitoring, and Controlling of Results</Name> 
     <Sequence>4</Sequence> 
     <WBS>1.1.4</WBS> 
     <BackgroundColor></BackgroundColor> 
     <FontColor>White</FontColor> 
     <Comments> 
     <Comment AddOnID = "53539AB26B50472CAA2DF4E428605C87" Version="0.2"></Comment> 
     </Comments> 
     <References></References> 
    </Structure> 
    <Structure nodeid="EFCCA56742074A2A859FD1C547850ABA" ParentID = "A6F7E2F0728147BB88429545A6C490CA" IsAddOnNode="False" IsCoreNode = "0" > 
     <Name>Project Performance Reports</Name> 
     <Sequence>1</Sequence> 
     <WBS>1.1.4.1</WBS> 
     <BackgroundColor></BackgroundColor> 
     <FontColor>White</FontColor> 
     <Comments></Comments> 
     <References></References> 
    </Structure> 

Quand il a été analysé avec ActiveX, la structure (dans le volet de navigation de gauche) est agencé comme un contour standard ou liste ordonnée:

1. Project Preparation 

1.1 Project Management 

    1.1.1 Phase Star-Up 

      1.1.1.1 Item 1 

      1.1.1.2 Item 2 

      1.1.1.3 Item 3 

Et ainsi de suite. Pour autant que je sache, ces valeurs qui dénotent la section ou la sous-section (1.1.1.2) sont stockées dans la balise WBS du nœud Structure. Je pense que ce que je dois faire est de les analyser et de créer la structure en fonction de cela. Comment faire c'est là où je suis perplexe.

De plus, il existe également un noeud Sequence qui permet de stocker des informations sur l'élément enfant de l'index hors de son élément parent.

Ce que je voudrais faire

Ce que je voudrais faire est de créer un groupe d'entrées de base de données (de préférence dans MPTT) afin que je puisse facilement générer un arbre de navigation et je peux commencer à se soucier de "racler" tous les fichiers individuels afin que je puisse stocker leur contenu dans la base de données aussi. D'une certaine façon, j'ai besoin d'analyser la valeur du nœud WBS pour créer son 'index' dans la table. J'espère que la solution est plus simple que ce que j'anticipe. Suggestions, un aiguillon dans la bonne direction serait grandement apprécié.

Je comptais sur l'utilisation du TreeBehavior au sein de CakePHP pour gérer cela, mais je ne suis pas nécessairement à l'utiliser pour traiter le fichier.

Répondre

1

Je peux me tromper, mais ne pas le:

<Structure nodeid="EFCCA56742074A2A859FD1C547850ABA" ParentID = "A6F7E2F0728147BB88429545A6C490CA"> 

vous donne nodeId de la structure et le parent correspondant de celui-ci? Donc, vous savez que EFCCA56742074A2A859FD1C547850ABA est un enfant de A6F7E2F0728147BB88429545A6C490CA?

Le stockage d'une structure de données arborescente dans un SGBDR est une longue histoire, car un SGBDR n'a pas le concept de hiérarchie, mais il existe différents modèles qui vous permettent d'accomplir une telle tâche. Vous pouvez vérifier http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures pour commencer.La liste d'adjacence est probablement le moyen le plus facile d'y parvenir, mais si vous utilisez mySQL, car elle n'a pas de requêtes récursives, cela signifie que vous devez faire beaucoup de jointures pour descendre jusqu'au dernier noeud ou traiter l'arbre dans votre couche d'application.

+0

C'est vrai, mais je suis plus préoccupé par l'analyse récursive des valeurs de nœud WBS. À moins que vous ne pensiez pouvoir le contourner complètement? –

+0

@BarryChapman Je crois que s'il y a déjà une liste adjacente définie dans votre XML avec les valeurs NodeId et ParentId vous devriez aller avec cela, au lieu d'essayer d'analyser une chaîne. À ma connaissance, la hiérarchie est définie par ces valeurs et non par le nœud WBS. – mobius