Données XML dans la base de données PostgreSQL
Quelle serait la meilleure méthode pour insérer des données XML (que je l'obtenir à partir d'une page web) dans une base de données PostgreSQL?
Je suis à l'aide de Java et ont besoin d'un peu d'aide pour trouver un bon moyen pour lire ces données dans la base de données.
source d'informationauteur krunarsson
Vous devez vous connecter pour publier un commentaire.
Postgres a (merci à Daniel Lyons pour le pointage) la prise en charge XML que vous pouvez utiliser pour stocker votre table. Si toutefois, vous voulez broyer vos données XML manuellement, il existe différentes possibilités pour représenter des données XML dans une base de données. La première question devrait être, si vous voulez une solution générique, qui sera en mesure de stocker n'importe quel document XML ou celle qui est spécifique à votre domaine (c'est à dire uniquement permet documents XML d'une certaine structure). En fonction de cela, vous aurez une très flexible, représentation universelle qui est toutefois plus difficile de requête (SQL nécessaires va être assez compliqué). Si vous avez une démarche plus spécifique, les requêtes sera plus simple, mais vous aurez besoin de créer de nouvelles tables ou ajouter de nouveaux attributs existants talbes chaque fois que vous souhaitez stocker un autre type de document ou d'ajouter un champ à un document existant; la modification du schéma sera plus difficile (ce qui est un avantage majeur de XML). Cette présentation devrait vous donner quelques idées de ce que sont les différentes possibilités.
Aussi, vous pouvez envisager de passer à une DB qui prend en charge Xquery, comme DB2. La capacité à natif de requête à l'aide de XQuery, une langue ciblée sur le traitement de fichiers XML, va simplifier beaucoup les choses.
Mise à JOUR: compte tenu de vos commentaires, vos données XML (qui vous lié à) est parfaitement relationnel. Il peut être mappé 1:1 le tableau suivant:
De sorte que toute
mynt
balise serait un enregistrement dans la table et du sous-balises attributs. Les types de données que j'ai recueillies à partir de vos données, ils pourraient être faux. Le principal problème est, IMO, qu'il n'est pas naturel de clé primaire, j'ai donc ajouté un générée automatiquement.J'ai un travail de mise en œuvre où je ne tout à l'intérieur de PostgreSQL sans autres bibliothèques.
Auxiliaire fonction d'analyse syntaxique
Poignée plusieurs valeurs
Ci-dessus mise en œuvre ne gère pas les plusieurs attributs à un xpath. Voici un surchargé version de
f_xml_extract_val()
. Avec le 3e paramètre, vous pouvez choisirone
(le premier),all
oudist
(distinctes) de valeurs. Plusieurs valeurs sont regroupées pour une chaîne séparée par des virgules.Appel:
Partie principale
Nom de la table cible:
tbl
; prim. clé:id
:Points importants:
Cette mise en œuvre des contrôles sur une clé primaire si la ligne existe déjà et mises à jour dans ce cas. Seulement de nouvelles lignes sont insérées.
- Je utiliser un transfert temporaire de la table d'accélérer la procédure.
pg_read_file()
a des restrictions. Je cite le manuel:Et:
Donc vous devez mettre votre fichier source il y a - ou créer un lien symbolique vers votre fichier/répertoire.
Ou vous pouvez fournir le fichier via Java dans votre cas (je l'ai fait tout à l'intérieur de Postgres).
Ou vous pouvez importer les données dans la colonne 1 de 1 rangée d'une table temporaire, et à partir de là.
Ou vous pouvez utiliser
lo_import
comme démontré dans cette liés à la réponse sur le dba.SE.Testé avec Postgres 8.49.0 et 9.1.
XML doit être bien formé.
Ce blog post par Scott Bailey m'a aidé.
PostgreSQL dispose d'un Type de données XML. Il y a beaucoup de XML fonctions spécifiques vous pouvez utiliser pour interroger et modifier les données, comme avec xpath.
De la Java côté, vous pouvez prétendre que vous êtes juste à travailler avec des chaînes, mais de savoir que les données sont bien formés sur la manière de sortir et il ne sera pas vous permettre de stocker non bien formé données.