Un XML ca veut pas dire grand chose. Tu veux partir de quoi et arriver à quoi ?
Interprétation débile de ta question : si tu pars d'un XML avec une liste de la requête suffit d'enlever les balises pour obtenir le code SQL :)-
J'ai fait un truc dans le genre en Perl - avec les bons modules, c'est assez facile :
XML::Parser - pour parser l'xml, oeuf corse - et Template Toolkit - pour transformer les données en bon gros fichier SQL.
Modulo quelques erreurs de retranscription, l'idée est de générer une arborescence des données à partir du xml, et de l'utiliser comme données d'entrée d'un template.
Le xml :
use XML::Parser;
use Template;
my $data;
my $tables;
my $currentTable;
my @cols;
my @pks;
sub database {
my ($o, $class, %args) = @_;
$vars->{database} = $args{name};
}
sub table {
my ($o, $class, %args) = @_;
undef @cols;
undef %currentTable;
$currentTable{name} = $args{name};
}
sub col {
my ($o, $class, %args) = @_;
$my $col = { name => $args{name},
type => $args{type},
default => $args{default},
auto_increment => $args{ai},
};
push (@cols, $col);
push (@pks, $col) if exists $args{pk} and $args{pk} eq "yes";
}
sub table_ {
my @c = @cols;
$currentTable{cols} = \@c;
@{$currentTable{pks}} = @pks;
my %h = %currentTable;
$tables{$h{name}} = \%h;
push (@tables, $h{name});
}
sub database_ {
$vars->{tables} = [ map { $tables{$_} } @tables ];
}
my $parser = new XML::Parser(Style => 'Subs');
$parser->parsefile($fichier) or die "Failed\n";
my $tt = Template->new();
$tt->process($tmpl, $data, $outfile) || do {
my $error = $tt->error();
print $error, "\n";
};
Le principal intérêt de ce truc c'est de créer plusieurs templates en fonctions des SGBD, ou carrément créer un template pour générer le code en C par ex pour faire quelques requêtes classiques (update/select/delete).
Oups désolé, je n'avais pas vu qu'on était dans le forum php, n'y voyez pas une tentative de lancer un troll, c'était vraiment involontaire : je consulte les news et les forums via le flux rss dans akregator, et je n'ai pas fais gaffe au sujet du forum. Ça peut fait un bon exercice de traduction ;-)
# Plus précisément ?
Posté par Pascal Terjan (site web personnel) . Évalué à 2.
Interprétation débile de ta question : si tu pars d'un XML avec une liste de la requête suffit d'enlever les balises pour obtenir le code SQL :)-
[^] # Re: Plus précisément ?
Posté par Pascal Terjan (site web personnel) . Évalué à 2.
si tu pars d'un XML avec une liste de <query>la requête</query>suffit d'enlever les balises pour obtenir le code SQL :)
# dtd?
Posté par niol (site web personnel) . Évalué à 2.
Il y a des choses qui existent avec des dtd faites pour cà chez microsoft et chez oracle (d'après google).
# id
Posté par TImaniac (site web personnel) . Évalué à 2.
# En parlant de SQL et de XML..
Posté par ~ lilliput (site web personnel) . Évalué à 1.
y'a t'il un DTS officiel pour ce genre de truc ?
http://www.theatre-eibel.fr http://www.isc2chapter-yorkshire.co.uk
[^] # Re: En parlant de SQL et de XML..
Posté par gc (site web personnel) . Évalué à 5.
# J'ai !
Posté par jigso . Évalué à 3.
DROP DATABASE [%database%]; CREATE DATABASE [%database%]; USE [%database%]; [%- FOREACH item = tables; %] CREATE TABLE `[%item.name%]` ( [%- sep = ''; FOREACH col = item.cols; sep %] `[%col.name%]` [% col.type -%] [%- IF col.notnull; %] NOT NULL[% END; -%] [%- IF col.ai;%] auto_increment[% ELSE %] default [% col.default; END; -%] [% sep=','; END; -%] [%- sep %] PRIMARY KEY ([% sep=''; FOREACH pk = item.pks; sep; "`"; pk.name; "`"; sep=', '; END; %]) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; [% END; %]Le script :use XML::Parser; use Template; my $data; my $tables; my $currentTable; my @cols; my @pks; sub database { my ($o, $class, %args) = @_; $vars->{database} = $args{name}; } sub table { my ($o, $class, %args) = @_; undef @cols; undef %currentTable; $currentTable{name} = $args{name}; } sub col { my ($o, $class, %args) = @_; $my $col = { name => $args{name}, type => $args{type}, default => $args{default}, auto_increment => $args{ai}, }; push (@cols, $col); push (@pks, $col) if exists $args{pk} and $args{pk} eq "yes"; } sub table_ { my @c = @cols; $currentTable{cols} = \@c; @{$currentTable{pks}} = @pks; my %h = %currentTable; $tables{$h{name}} = \%h; push (@tables, $h{name}); } sub database_ { $vars->{tables} = [ map { $tables{$_} } @tables ]; } my $parser = new XML::Parser(Style => 'Subs'); $parser->parsefile($fichier) or die "Failed\n"; my $tt = Template->new(); $tt->process($tmpl, $data, $outfile) || do { my $error = $tt->error(); print $error, "\n"; };Le principal intérêt de ce truc c'est de créer plusieurs templates en fonctions des SGBD, ou carrément créer un template pour générer le code en C par ex pour faire quelques requêtes classiques (update/select/delete).[^] # Re: J'ai !
Posté par jigso . Évalué à 3.
[^] # Re: J'ai !
Posté par Pascal Terjan (site web personnel) . Évalué à 3.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.