Ajouter Doctype a un fichier XML avec libxml


#1

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

Sauf que je n’ai pas pu trouver comment faire…

Libxml serait une mauvaise idée?


#2

Fabien T. wrote:

LibXML::XML::Document.new()
fichier

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


#3

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?


#4

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


#5

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


#6

Via XML::Document.io ou XML::Document.file, tu peux passer tes options

En voici la liste :
http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Parser/Options.html

Ce n’est qu’une piste, je n’ai pas testé


#7

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/XML/Parser/Options.html

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 . Je fouille dans ce sens et je vous tient au courant

Merci pour votre aide

Fabien


#8

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 . 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
\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