Forum: Rails France Ajouter Doctype a un fichier XML avec libxml

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fabien T. (Guest)
on 2009-04-14 17:04
Bonjour,

cela fait quelques heures maintenant que je cherche et je n'ai toujours
pas de solution.

J'aimerais utiliser libxml dans toute mon application, et donc je suis
en train de mirgrer des outils. Anciennement les fichiers XML étaient
écrits textuellements dans un fichier standard.

J'essaie de créer un fichier XML:
LibXML::XML::Document.new()

je rajoute un noeud racine

document.root = LibXML::XML::Node.new("racine")

et à partir de là je rajoute des noeuds et des attributs...

Vous voyez sans doute la méthode.

Et ce que je voudrais faire c'est ajouter ce genre de noeud à mon
fichier

<!DOCTYPE ma_dtd SYSTEM "MaDtd.dtd"/>

Sauf que je n'ai pas pu trouver comment faire...

Libxml serait une mauvaise idée?
Cyril M. (Guest)
on 2009-04-14 17:20
(Received via mailing list)
Fabien T. wrote:
> LibXML::XML::Document.new()
> fichier
>
> <!DOCTYPE ma_dtd SYSTEM "MaDtd.dtd"/>
>
> Sauf que je n'ai pas pu trouver comment faire...
>
> Libxml serait une mauvaise idée?
>
Un doctype est une DTD :
http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Dtd.html

Il suffit d'ajouter cet objet à ton document je pense.

--
Cyril M.
http://blog.shingara.fr
Fabien T. (Guest)
on 2009-04-14 17:40
> Un doctype est une DTD :
> http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Dtd.html
>
> Il suffit d'ajouter cet objet à ton document je pense.
>
> --
> Cyril M.
> http://blog.shingara.fr


ça pourrait être ça, sauf que je ne vois pas comment le rajouter au
document.

J'ai essayé de le rajouter à document.root, ça rend pas du tout, il me
dit que le c'est pas noeud. Alors j'ai essayé de l'ajouter au document
avec << sauf que ça n'existe pas pour document...

En fait je crois que c'est plus "Comment ajouter quelque chose dans le
document entre
<?xml version="1.0"?>
et le premier noeud"

Ce qui est bête c'est que ça a l'air possible pour les namespaces...
Alors pourquoi pas une DTD?
Yannick F. (Guest)
on 2009-04-14 18:18
(Received via mailing list)
Le 14 avril 2009 15:40, Fabien T. <removed_email_address@domain.invalid> a écrit
:
>
> ça pourrait être ça, sauf que je ne vois pas comment le rajouter au
> document.
>
> J'ai essayé de le rajouter à document.root, ça rend pas du tout, il me
> dit que le c'est pas noeud. Alors j'ai essayé de l'ajouter au document
> avec << sauf que ça n'existe pas pour document...

Bonjour,

En lisant l'API je dirais qu'il faut faire un truc comme:

doc = XML::Document.new()
doc <<  XML::Dtd.new("public", "system") # Ou un autre des constructeurs

http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Dtd.html

Cela ne fonctionne pas ? (j'ai pas vraiment moyen de tester
là)


--
Yannick F.
Directeur associé
+33 683 785 716
<http://kantena.com>
Fabien T. (Guest)
on 2009-04-14 18:45
> Bonjour,
>
> En lisant l'API je dirais qu'il faut faire un truc comme:
>
> doc = XML::Document.new()
> doc <<  XML::Dtd.new("public", "system") # Ou un autre des constructeurs
>
> http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Dtd.html
>
> Cela ne fonctionne pas ? (j'ai pas vraiment moyen de tester
> l�)


Non j'ai essayé de cette manière juste après la création. Il me dit
toujours que la fonction << n'existe pas pour les Document et il n'est
pas possible de le faire pour doc.root non plus
Tony C. (Guest)
on 2009-04-14 19:59
Via XML::Document.io ou XML::Document.file, tu peux passer tes options

En voici la liste :
http://libxml.rubyforge.org/rdoc/classes/LibXML/XM...

Ce n'est qu'une piste, je n'ai pas testé
Fabien T. (Guest)
on 2009-04-14 23:29
Tony C. wrote:
> Via XML::Document.io ou XML::Document.file, tu peux passer tes options
>
> En voici la liste :
> http://libxml.rubyforge.org/rdoc/classes/LibXML/XM...
>
> Ce n'est qu'une piste, je n'ai pas testé


Je viens d'essayer de regarder dans ce sens et a priori les options
permettent d'ignorer ou pas des élements qui sont dans le fichier
lorsqu'il est parsé.

J'ai tenté une autre approche, virer le début du fichier et le réécrire,
pour l'instant j'ai des erreurs il ne veut pas parser le <!DOCTYPE ...
/> . Je fouille dans ce sens et je vous tient au courant

Merci pour votre aide

Fabien
Fabien T. (Guest)
on 2009-04-15 00:16
> J'ai tenté une autre approche, virer le début du fichier et le réécrire,
> pour l'instant j'ai des erreurs il ne veut pas parser le <!DOCTYPE ...
> /> . Je fouille dans ce sens et je vous tient au courant
>
> Merci pour votre aide
>
> Fabien

L'erreur ci dessus vient du fait qu'il veut à tout prix au moins un
noeud. Voici ce que je fais :

root = document.root # Recuperation de l'ancienne racine

document = LibXML::XML::Document.string("<?xml version=\"1.0\"
encoding=\"iso-8859-1\"?>\n
       <\!DOCTYPE "+dtd_name+" SYSTEM \""+dtd_file_name+"\">\n
        <root />\n") #Creation d'un nouveau fichier XML contenant le
prologue, le DOCTYPE ( je pense l'étendre avec un objet DTD plus tard)
et on créée une racine temporaire... Elle est là juste pour faire
plaisir au parseur

      document.root = root #On remet l'ancienne racine ( et donc
l'ancienne arborescence

Voilà, en espèrant trouver mieux par la suite

Bonne fin de journée,

Fabien
This topic is locked and can not be replied to.