Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2584 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème d'architecture de software

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème d'architecture de software

n°2235684
bossamiral​2
Ctrl+Alt+Del
Posté le 15-08-2014 à 16:03:55  profilanswer
 

Bonjour,  
 
Je dois faire un petit programme et j'ai un gros doute sur comment architecturer le soft.  
 
Je vous explique donc au mieux le but du soft.  
 
De base j’exécute des appels api sur des serveurs distants et je reçois une réponse en XML.  
Je dois stocker ces réponses dans une base de donner en local (Exemple Access, Sqlite ou autre).  
Par la suite de dois faire du processing de data (en gros des requêtes sql sur la base de donnée local).
 
Ou est mon problème :
 
Voilà j'ai un doute sur la meilleure manière de transférer ma réponse XML dans la base de donnée local. Je pensais au début décoder le xml et créer une insert to dans la table correspondante, mais je ne trouve pas cela super efficient. Car je vais boucler sur la structure du XML pour recréer une requête.  
 
Il n'y aurait pas un parseur XML to SQL ?
Ou vous voyez une autre manière de faire plus intéressante ?

mood
Publicité
Posté le 15-08-2014 à 16:03:55  profilanswer
 

n°2235691
TotalRecal​l
Posté le 15-08-2014 à 18:37:20  profilanswer
 

Ca dépend de la complexité et de la variabilité des XML.
Si tu dois faire un modèle relationnel pour tous les scénarios et que ton XML est complexe t'as pas fini. Ca te complexifie le schéma en base, l'implémentation et c'est source de bugs, donc si en plus ça ne sert à rien (pas de valeur ajoutée pour le besoin) c'est clairement à oublier.

 

Tu donnes trop peu de détails pour qu'on t'oriente efficacement mais comme ça, à l'arrache, je dirai de mixer les deux :
- Stocker le XML tel quel pour avoir le "détail" des données échangées.
- Matérialiser à côté dans la base tous les champs fortement structurant, nécessaires aux requêtes d'extraction que tu devras faire par exemple, et éventuellement indexer dessus là où c'est pertinent.

 

Je ne comprend même pas ce que tu entends par "parseur XML to SQL".
Pour manipuler du XML côté base il y a XPath mais c'est assez complexe et pas forcément justifié, voir aussi ce que propose le type "XML" supporté par certains sgbdr.

 

Pour le parser côté code, une fois les "bonnes" lignes extraites avec l'approche proposée ci-dessus, tu peux utiliser linq to xml.

 

Mais encore une fois tu donnes trop peu de détails.

 

Ah, et oublie Access :sarcastic:. Si tu veux du Microsoft gratuit prend plutôt SQL Server Express (en environnement .Net type Entity Framework c'est simple à intégrer et déjà très puissant).
Si tu veux de l'open source, SQLite ou autre, y a le choix et encore une fois ça dépend du besoin et des contraintes de charge et d'hébergement...


Message édité par TotalRecall le 15-08-2014 à 18:42:30

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2235720
bossamiral​2
Ctrl+Alt+Del
Posté le 16-08-2014 à 14:43:12  profilanswer
 

Oui pour la base de donnée ça va être du sqlite.
 
Sinon j'utilise un xmldocument, je parcours les nodes du document pour créer une requête "insert into".  
 
Mais je suppose que l'on peut directement charger le fichier xml dans la base de donnée.  
 
Donc en théorie je gagnerais l'étape de parcourir la structure du fichier xml pour créer ma requête.
 
Actuellement
 
Requête api sur serveur distant, je recupère un flux XML. Je parcours le fichier XML pour faire un requête insert into.
 
Je suppose que l'on peut faire :
Requête api sur serveur distant , je récupère le flux xml, que le load directement dans la database (enfin je load le fichier xml complet).

n°2235737
TotalRecal​l
Posté le 17-08-2014 à 11:39:39  profilanswer
 

Si tu passes par un ORM et que tu tiens à matérialiser en base toute la structure correspondant au XML, il n'y a qu'à ajouter sur les classes objets de la base les attributs et méthodes pour serializer/deserializer dessus directement le XML pour mapper directement XML -> BDD et réciproquement.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2235740
gilou
Modérateur
Modzilla
Posté le 17-08-2014 à 15:00:32  profilanswer
 

Une solution possible serait de faire ça en XSLT, en utilisant comme processeur Saxon et son extension SQL
Et ici un exemple plus riche de l'emploi de cette extension: http://journal.code4lib.org/articles/6486
Bon par contre, le produit est devenu payant maintenant :/
A+,


Message édité par gilou le 17-08-2014 à 15:05:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2235759
bossamiral​2
Ctrl+Alt+Del
Posté le 18-08-2014 à 08:00:17  profilanswer
 

Merci je vais voir ce que cela donne.

n°2241899
MagicBuzz
Posté le 31-10-2014 à 16:58:19  profilanswer
 

Bonjour,
 
Pour reprendre la réponse de TotalRecall, Microsoft SQL Server Express en mode LocalDB est une très bonne alternative à SQLLite.
 
Et il a l'avantage de supporter un type de colonnes "xml" qui permet :
- de stocker directement un flux XML dans une colonne de la table
- de combiner SQL et XPath pour retrouver les lignes
 
D'un point de vue performances, c'est extrêmement performant, contre toute attente.

n°2241913
MagicBuzz
Posté le 31-10-2014 à 18:18:02  profilanswer
 

Exemple pour illustrer :

Code :
  1. CREATE TABLE testxml
  2. (
  3.     id int PRIMARY KEY identity,
  4.     DATA xml NOT NULL
  5. );
  6.  
  7. INSERT INTO testxml (DATA) VALUES ('<document name="doc1"><ligne id="1">doc1 valeur ligne 1</ligne><ligne id="2">doc 1 valeur ligne 2</ligne><ligne id="3">doc 1 valeur ligne 3</ligne></document><document name="doc2"><ligne id="1">doc2 valeur ligne 1</ligne><ligne id="2">doc 2 valeur ligne 2</ligne><ligne id="3">doc 2 valeur ligne 3</ligne></document>');
  8. INSERT INTO testxml (DATA) VALUES ('<vehicule type="voiture"><places>5</places><couleur>rouge</couleur></vehicule>');
  9. INSERT INTO testxml (DATA) VALUES ('<vehicule type="camion"><places>2</places><couleur>blanc</couleur></vehicule>');
  10.  
  11. SELECT DATA.value('(/vehicule/@type)[1]', 'varchar(20)') FROM testxml WHERE DATA.exist('/vehicule/places') = '5';
  12.  
  13. SELECT t2.doc.value('./@name', 'varchar(20)')
  14. FROM testxml t
  15. CROSS apply DATA.nodes('/document') AS t2(doc);
  16.  
  17. SELECT t2.doc.value('.', 'varchar(20)')
  18. FROM testxml t
  19. CROSS apply DATA.nodes('/document/ligne') AS t2(doc);
 

On a beau avoir des lignes de structure XML différente, on peut toujours faire du XPath dessus et retrouver ses petits de manière performante directement avec SQL.

 

http://msdn.microsoft.com/fr-fr/library/ms187339.aspx


Message édité par MagicBuzz le 31-10-2014 à 18:19:45

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème d'architecture de software

 

Sujets relatifs
Problème Macro excel 2007Probleme de 0x00
Envoi de mails avec SMTP problème avec caractères spéciauxEst-ce que mon architecture est bonne?
Excel: Problème pour étendre une sélectionProblème d'utilisation d'une librairie JS..
Petit problème d'alignementJAVASCRIPT > problème de vérification mail (formulaire)
problème installation compilateur FLEX sur AIX 7.1Problème avec VBA, projet finance
Plus de sujets relatifs à : Problème d'architecture de software


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR