Lire un fichier XML sans sa DTD - C#/.NET managed - Programmation
Marsh Posté le 09-02-2005 à 18:45:29
J'aurai du préciser que je ne peux pas modifier le fichier bien sur !
Marsh Posté le 09-02-2005 à 18:54:30
C'est étrange tout cela, la méthode Load de XMLDocument précise ceci :
Citation : Cette méthode n'effectue aucune validation DTD ou de schéma. Si vous souhaitez qu'une validation ait lieu, vous devez passer un XmlValidatingReader, spécifier le XmlValidatingReader.ValidationType approprié et fournir un XmlValidatingReader.ValidationEventHandler. |
Marsh Posté le 09-02-2005 à 18:59:21
C'est étrange en effet, il n'y a soit disant pas de validation DTD.
Toutefois, essaie de faire un Load sur le document XML que j'ai donné, tu verras qu'il envois un XMLException en précisant qu'il ne trouve pas le fichier .dtd.
Marsh Posté le 09-02-2005 à 19:09:14
Ok, j'ai trouvé :
Code :
|
En fait, faut utiliser un XmlTextReader, et mettre la propriété XmlResolver à Nothing (null donc en C#). Voici ce que dit la MSDN :
Citation : XmlResolver à utiliser. Si la valeur est une référence null (Nothing dans Visual Basic), les ressources externes ne sont pas résolues. |
Marsh Posté le 09-02-2005 à 19:25:14
Yes !!! ça marche !
En fait je m'étais orienté vers la propriété ProhibitDtd de XmlTextReader qui ne resolvait pas mon problème. Là ça fonctionne
Merci beaucoup
Marsh Posté le 10-02-2005 à 11:11:35
Je post la solution complète au cas ou cela puisse resservir :
Code :
|
Marsh Posté le 10-02-2005 à 11:12:50
Par contre, change le catch vide, c'est pas bien de masquer les exceptions
Marsh Posté le 10-02-2005 à 11:16:50
Sauf que là si ça plante, il se passera rien, donc le pauvre client va réessayer 5 fois sans rien comprendre. Hors qu'un petit message genre "Erreur lors de la lecture du fichier XML : vérifier que le fichier est un fichier XML valide" ne peut pas faire de mal
Marsh Posté le 10-02-2005 à 11:29:42
Hum oui non mais si tu regardes bien ma méthode retourne un bool.
Si c'est un false, c'est que le doc n'est a priori pas de type MCTO, donc c'est à la suite de l'appel de cette fonction que j'avertie l'utilisateur
Marsh Posté le 10-02-2005 à 11:31:55
Donc, dans ton catch, tu met :
Code :
|
Par pur soucis de rigueur, et pour éviter les ambiguité
Marsh Posté le 11-02-2005 à 15:07:59
Slt le gars,
je viens de finir mon appli qui consiste à créer un schema XML en tirant différentes infos de la base de données par un méthode d'encapsulation (un GetSchema appelle une collection de "Tables" qui appelle chaque instance de table==>colonnes==> contraintes...). Apres avoir remonté tous mes éléments déjà formaté en XML, je souhaite juste tout copier dans un fichier XML. Voilà comment faire??
Merci d'avance
Marsh Posté le 11-02-2005 à 15:12:25
Y'aurait pas moyen genre en sérialisant le schéma d'un DataSet
Marsh Posté le 11-02-2005 à 15:22:55
j'utilise pas de DataSet, je remonte tout dans un string.
Marsh Posté le 11-02-2005 à 15:23:46
Alors y'a un constructeur de XmlDocument qui accepte une String en entrée, et après y'a une méthode genre Save qui doit pouvoir le sauvegarder vers un fichier
Marsh Posté le 11-02-2005 à 15:39:56
Et pourtant, c'est une des meilleure documentation jamais conçue
Marsh Posté le 11-02-2005 à 15:46:20
c'est clair mais lol c'est à cause de cela, il y tro d'infos lol mais je crois que c'est parce que je suis encore au taf et que c'est presque le week-end lol
Marsh Posté le 30-06-2008 à 09:16:11
Bonjour,
tout d'abord merci pour le bout de code car il m'a aidé.
Toutefois j'ai un deuxième probleme:
Ce code ci-desous:
static void Main(string[] args)
{
XmlTextReader docxml = null;
docxml = new XmlTextReader("U:\\pki_data\\CTE_Beispiel\\addi\\addi\\addexample.xml" );
docxml.WhitespaceHandling = WhitespaceHandling.None;
docxml.XmlResolver = null;
XmlDocument doc = new XmlDocument();
doc.Load(docxml);
docxml.Read();
Console.Write("<" + docxml.Name + " " );
Console.Write("version: " + docxml.GetAttribute("version" ) + ">\n" );
}
me donne ceci sur la console(après exécution):
<version: >
On dirais que mes fonctions: docxml.Name et docxml.GetAttribute("version" ) ne sont pas prise en compte.
J'ai essayé avec deburg, et je constate qu'elle sont vide c'est à dire docxml.GetAttribute("version" ) =NULL et l'autre aussi pourquoi? je ne sais.
Je serais très ravie si quelqu'un pouvais m'aider.
merci d'avance de me venir en aide.
Marsh Posté le 30-06-2008 à 13:23:36
ReplyMarsh Posté le 30-06-2008 à 14:03:47
ReplyMarsh Posté le 30-06-2008 à 14:07:53
à ceci:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cteobject SYSTEM "ctexl-1.0.dtd">
<cteobject nextpid="337" pid="p0">
<tree type="root" name="add" pid="p2">
<nodelayout xpos="200" ypos="20" pagepid="p1">
<layoutstyle fgcolor="#000000" fontstyle="plain" fontfamily="Arial" bgcolor="#ffffff" fontsize="10"/>
</nodelayout>
<activetag tagtype="Autolayout" pid="p35">
<AUTOLAYOUT distParent="35" type="1" distY="20" alignment="0.0" fixed="false" distX="20"/>
</activetag>
</tree>
</cteobject>
merci
Marsh Posté le 30-06-2008 à 14:24:00
Ce code fonctionne:
Code :
|
Marsh Posté le 09-02-2005 à 13:34:52
Bonjour à tous,
Je rencontre un problème pour lire un fichier XML sans sa DTD.
Ce document se présente ainsi :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message SYSTEM "mcto-1-0.dtd">
<message>
<codage>
<format value="MCTO"/>
<version value="1.0"/>
</codage>
<entete>
<origine>
<emetteur>
<libelle>Tous les tours</libelle>
</emetteur>
<date_emission>
<date_hms>
<date jour="12" mois="12" annee="2002"/>
<hms heure="07" minute="04" seconde="04"/>
</date_hms>
</date_emission>
<canal_distribution value="TEL"/>
</origine>
<recepteur code="C0012"/>
<payeur code="444"/>
<decimales>2</decimales>
<devise value="EUR"/>
</entete>
</message
Je ne possède pas le fichier mcto-1-0.dtd, mais j'aimerai parcourir le fichier pour récupérer l'attribut "value" du node <format> contenu dans le node <codage> : c'est à dire "MCTO".
L'utilisation de la classe XMLDocument n'est pas possible : en effet, lors de l'appel de la méthode Load(string filename), j'ai une exception de levée (le dtd n'a pas été trouvé...).
Je me suis tourné vers XmlTextReader, mais là encore je bloque. Lors du parcours de mon fichier avec la méthode Read(), j'ai une exception lorsque le lecteur arrive sur le DOCTYPE (dtd non trouvée) :
while (xmlTextReader.EOF != true)
{
xmlTextReader.Read();
}
Bref, je ne m'en sors pas
Si quelqu'un a une solution je suis preneur