2010-11-11 6 views
3

Voici deux XML, j'essaie de comparer et de mettre les données respectives dans une feuille Excel. J'ai un tableau multidimensionnel appelé dispositions.Comparer XML en Java

<xml> 
<Item type="ItemHeader" name="Plan Features" id="id_1"></Item> 
<Item type="Deductible" name="Deductible" id="a">Calendar Year 
<Item type="Text" name="Individual" id="b">5,000</Item> 
<Item type="Text" name="Family" id="c">10,000</Item> 
<Item type="Text" name="Family Out-of-Network" id="id_4">15,000</Item> 
</Item> 
<Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2"> 
<Item type="Text" name="Individual" id="d">5,000</Item> 
<Item type="Text" name="Family" id="e">10,000</Item> 
</Item> 
<Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item> 
<Item type="Text" name="Coinsurance" id="f"></Item> 
<Item type="Text" name="Office Visits" id="g"></Item> 
<Item type="Text" name="Routine Physicals" id="h"></Item> 
<Item type="Text" name="Preventive Care" id="m"></Item> 
<Item type="Text" name="Physician Services" id="i"></Item> 
<Item type="Text" name="Emergency Room Services/Urgent Care" id="j"></Item> 
<Item type="Text" name="Hospital Admission Services" id="k"></Item> 
<Item type="Text" name="Chiropractic" id="n"></Item> 
<Item type="Text" name="Prescription Drugs" id="l"></Item> 
<Item type="Text" name="Specialty Drugs" id="o"></Item> 
<Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item> 
<Item type="Boolean" name="Conversion Privilege" id="p">false</Item> 
<Item type="ItemHeader" name="Plan Setup" id="id_3"></Item> 
<Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item> 
<Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item> 
<Item type="Participation" name="Participation Requirement" id="s"></Item> 
</xml> 

ET

<xml> 
<Item type="ItemHeader" name="Plan Features" id="id_1"></Item> 
<Item type="Deductible" name="Deductible" id="a">Calendar Year 
<Item type="Text" name="Individual" id="b">3,000</Item> 
<Item type="Text" name="Family" id="c">6,000</Item> 
</Item> 
<Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2"> 
<Item type="Text" name="Individual" id="d">5,000</Item> 
<Item type="Text" name="Family" id="e">10,000</Item> 
</Item> 
<Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item> 
<Item type="Text" name="Coinsurance" id="f"></Item> 
<Item type="Text" name="Office Visits" id="g"></Item> 
<Item type="Text" name="Routine Physicals" id="h"></Item> 
<Item type="Text" name="Preventive Care" id="m"></Item> 
<Item type="Text" name="Physician Services" id="i"></Item> 
<Item type="Text" name="Emergency Room Services/Urgent Care" id="j"></Item> 
<Item type="Text" name="Hospital Admission Services" id="k"></Item> 
<Item type="Text" name="Chiropractic" id="n"></Item> 
<Item type="Text" name="Prescription Drugs" id="l"></Item> 
<Item type="Text" name="Specialty Drugs" id="o"></Item> 
<Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item> 
<Item type="Boolean" name="Conversion Privilege" id="p">false</Item> 
<Item type="ItemHeader" name="Plan Setup" id="id_3"></Item> 
<Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item> 
<Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item> 
<Item type="Participation" name="Participation Requirement" id="s"></Item> 
</xml> 

maintenant ces données XML est pour 2 plans et mon tableau contient des dispositions

dispositions == [[plan Features ,,] [,, franchise] [Individuel, ,] .....]

C'est ce que je l'ai fait

for(int j = 0; j < plans.length; j++){ 
    Vector<String> vr = (Vector<String>) tagidPlan.get(plans[j].getId()); 
    for(int i = 0; i < vr.size(); i++){ 
    provisions[i][j+1] = getValues(plans[j],vr.get(i)); 
    } 
} 

Le problème se produit lorsque ce noeud supplémentaire de la famille Out-of-network entre en image. Ceci est mon tableau final est

[[Plan Features:, Medical HMO, Medical PPO], [Deductible Year:, Calendar Year, Calendar Year], [Individual:, 5,000, 3,000], [Family:, 10,000, 6,000], [Family Out-of-Network:, 15,000, null], [Out-of-Pocket Annual Maximum:, null, 5,000], [Individual:, 5,000, 10,000], [Family:, 10,000, Unlimited], [Life Time Maximum:, Unlimited, ], [Coinsurance:, , ], [Office Visits:, , ], [Routine Physicals:, , ], [Preventive Care:, , ], [Physician Services:, , ], [Emergency Room Services/Urgent Care:, , ], [Hospital Admission Services:, , ], [Chiropractic:, , ], [Prescription Drugs:, , ], [Specialty Drugs:, , false], [Pre Tax Reduction Available:, false, false], [Conversion Privilege:, false, ], [Plan Setup:, , Immediate], [Benefit Termination Date:, Immediate, Not Applicable], [Premium Redetermination Date:, Not Applicable, ], [Participation Requirement:, , null]] 

Je veux obtenir les bonnes valeurs dans l'élément de tableau correspondant.

code plus peut être vu ici pastie.org/1308625

+1

Avez-vous pensé à XSLT? Il semble que ce serait un bon ajustement dans ce scénario. – javamonkey79

+0

bien, je n'utilise pas XSLT, les données XML sont stockées dans la base de données dans un format de chaîne. – yogsma

+2

Évitez d'utiliser Vector. Il est vieux et utilise beaucoup de mémoire. Utilisez plutôt une collection, par exemple ArrayList. –

Répondre

4

Ne pas utiliser un tableau.

Utilisation: Map<String, Map<String, String>>

de telle sorte que:

  • la première chaîne (clé de la carte externe) est le nom de la fonction (par exemple, "Durée de vie maximale")
  • la deuxième chaîne (clé à la carte interne) est le nom du plan (il ne semble pas y avoir de nom de plan dans vos documents XML, donc "Plan1" et "Plan2" peuvent suffire)
  • la troisième chaîne (valeur de la carte interne) devrait être la valeur de cette caractéristique particulière dans ce particulier plan (par ex. « Illimité » pour « Life Time Maximum » dans « Plan1 »)

Vous pourriez avoir:

{ Life Time Maximum: { Plan1: Unlimited, Plan2: Unlimited } } 
{ Family Out-Of-Network: { Plan1: 15,000 } } 

que, contrairement à un tableau, le nombre d'entrées pour chaque fonction ne doit pas être fixes (caractéristiques différentes peuvent avoir différents nombres d'entrées)

+0

Comment est-ce que je mettrais le même plan1 comme clé pour différentes valeurs? – yogsma

+0

Chaque entité portera le nom de l'entité et ce nom sera mappé à une carte distincte des noms de plan par rapport aux valeurs d'entité. Bien que "Plan1" et "Plan2" apparaissent plusieurs fois, ils ne s'affichent qu'une fois dans une carte individuelle des noms de plan et des valeurs d'objet. – barrowc

+0

Il y a toujours un problème avec ce que vous dites, car il y a des doublons individuels et familiaux jusqu'à l'équation entière. – yogsma

1

Voici un algorithme simple:

  • Chargez les données dans deux modèles DOM
  • Effectuez une itération sur tous les nœuds du premier modèle, en commençant par la profondeur (c.-à-d. premier travail sur les enfants puis sur les nœuds parents)
  • Essayez de trouver le même nœud dans le second modèle.Si vous ne pouvez pas en trouver un -> Vous avez trouvé un nœud qui n'existe que dans le document 1
  • Comparez tous les attributs entre les deux nœuds. Ajoutez les différences à votre feuille Excel
  • Retirez le nœud du deuxième document à moins qu'il a des enfants
  • itérer sur tous les nœuds du second modèle, en profondeur d'abord
  • Essayez de trouver le même nœud dans le premier modèle. Si vous ne pouvez pas en trouver un -> Vous avez trouvé un nœud qui n'existe que dans le document 2

En fonction de la structure (c'est-à-dire si vous êtes sûr que les nœuds sont toujours les mêmes et seuls les attributs/textes enfants peuvent être différent), vous pouvez omettre certaines étapes.

+0

logiquement c'est parfait, le problème c'est que je n'aurais pas forcément 2 DOMs, il peut y avoir n nombre. – yogsma

+0

La comparaison N-way fonctionne de la même manière mais crée de la confusion pour l'utilisateur. Essayez plus fort pour réduire le problème à une comparaison bidirectionnelle. Par exemple, définissez le document comme «racine» et comparez tous les autres à celui-ci. –

2

Jetez un oeil à DiffX (API Java Open Source pour XML Diffing). Il fournit les algorithmes pour comparer les documents XML, et il vous donne un bon résumé des noeuds/attributs/texte qui ont été ajoutés/supprimés/modifiés (les changements sont indiqués comme une suppression, suivi d'un insert). Nous l'utilisons dans un projet auquel je participe actuellement; ça marche vraiment bien.