[C#2] - Etendre la classe XmlDocument

Bonjour je vous écris car j’ai un petit souçi, rien du tout sans doute mais tout de même, ce genre de petit grain de sable qui vous pourri la vie…

Donc je cherche à faire un petit programme qui génèrerai (Oui je met tout au conditionnel désormais :stuck_out_tongue: ) des fichiers SVG.

Pour l’instant je regarde un peu comment se manipule les classes du .NET Framework qui manipulent le XML etc.

Bref j’ai donc une classe SvgDocument qui étend la classe XmlDocument :

[code]using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace SvgProcessor
{
public class SvgDocument : XmlDocument
{
public SvgDocument()
{
XmlDocument svg = new XmlDocument();
XmlDeclaration declaration = svg.CreateXmlDeclaration(« 1.0 », « utf-8 », « yes »);
XmlDocumentType doctype = svg.CreateDocumentType(« svg », « -//W3C//DTD SVG 1.1//EN »,« http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd »,null);
XmlElement rootelement = svg.CreateElement(« svg »);

	   svg.AppendChild(declaration);
	   svg.AppendChild(doctype);
	   svg.AppendChild(rootelement);

	}

/* Dans le debug, il m’indique : svg.InnerXml = « <?xml version="1.0" encoding="utf-8" standalone="yes"?> » donc à priori c’est bon. */

	public void CreateLayer()
	{
		XmlElement element = this.CreateElement("g");
		this.AppendChild(element);
	}
}

}[/code]

Donc tout va bien. Le problème c’est que quand j’instancie ma classe à partir de Program.cs :

class Program { public static void Main(string[] args) { SvgDocument svgDoc = new SvgDocument(); Console.WriteLine(svgDoc.OuterXml()); Console.ReadLine(); } }

svgDoc est vierge plus rien !!! Je ne comprends pas.
Merci :stuck_out_tongue:

Euh, j’ai l’impression que tu mélanges un peu tout là : tu fais une classe qui hérite de XmlDocument, mais tu instancies un XmlDocument dans ton constructeur ??

Dans ton constructeur tu initialises une variable locale que tu remplies : ok, correct, le debugger t’affiche bien le contenu de ta variable.

Sorti du constructeur, ta variable est libérée, et tu n’a pas du tout touché à ton document (ta classe SvgDocument EST le document xml, pas besoin de créer un autre document xml en interne).

Tu devrais plutôt faire des this à la place de svg pour que le constructeur serve au moins à qq chose.

[quote=« Styx31, post:2, topic: 26553 »]Euh, j’ai l’impression que tu mélanges un peu tout là : tu fais une classe qui hérite de XmlDocument, mais tu instancies un XmlDocument dans ton constructeur ??

Dans ton constructeur tu initialises une variable locale que tu remplies : ok, correct, le debugger t’affiche bien le contenu de ta variable.

Sorti du constructeur, ta variable est libérée, et tu n’a pas du tout touché à ton document (ta classe SvgDocument EST le document xml, pas besoin de créer un autre document xml en interne).

Tu devrais plutôt faire des this à la place de svg pour que le constructeur serve au moins à qq chose.[/quote]

Comme çà :

[code] public SvgDocument()
{
XmlDeclaration declaration = this.CreateXmlDeclaration(« 1.0 », « utf-8 », « yes »);
XmlDocumentType doctype = this.CreateDocumentType(« svg », « -//W3C//DTD SVG 1.1//EN »,« http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd »,null);
XmlElement rootelement = this.CreateElement(« svg »);

	   this.AppendChild(declaration);
	   this.AppendChild(doctype);
	   this.AppendChild(rootelement);

	}[/code]

En effet il semble que je me sois emmêlés les pinceaux. :stuck_out_tongue:

Oui, dans ton constructeur tu cree un svg en tant que XmlDocument, mais t’en fait rien, c’est this qu’il faut que tu remplisses, pas un nouveau XmlDocument. Enfin styx l’a deja bien dit :stuck_out_tongue: je repete :stuck_out_tongue:

Ok je vous remercie… je comprends mieux maintenant !!!

[EDIT] En revanche il est super long à l’execution de la commande

XmlDocumentType doctype = this.CreateDocumentType("svg", "-//W3C//DTD SVG 1.1//EN","http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd",null);

C’est normal ???

Ben je pense qu’il va chercher la DTD sur le net a l’adresse que tu lui donne :stuck_out_tongue:

Et bien c’est long tout çà, à l’heure du Internet haut-débit ! Non je plaisante bien sur, mais je vais voir si je ne peux pas me dispenser de cette dtd…

La DTD n’a d’utilité que si tu n’es pas sur de la “qualité” de ton xml.

Si c’est ton programme ou ta lib qui le génère, tu peux tranquillement la faire sauter à mon avis, surtout si ca génère des problèmes de perfromance.

A voir tout de même s’il n’existe pas un système pour que la DTD ne soit pas vérifiée pendant la création mais seulement à la demande.

[quote=« Styx31, post:8, topic: 26553 »]La DTD n’a d’utilité que si tu n’es pas sur de la « qualité » de ton xml.

Si c’est ton programme ou ta lib qui le génère, tu peux tranquillement la faire sauter à mon avis, surtout si ca génère des problèmes de perfromance.

A voir tout de même s’il n’existe pas un système pour que la DTD ne soit pas vérifiée pendant la création mais seulement à la demande.[/quote]

D’autant plus qu’à ce moment là, il ne valide rien du tout je pense, il doit simplement charger la dtd parce que le document n’en est qu’à ce stade…

[code]<?xml version="1.0" encoding="utf-8" standalone="yes"?>

[/code]

En effet, je validerai bien le document avant de le sauver dans un fichier. Est-ce qu’il ne faudrait pas intégrer la dtd directement en local ??? (Parce que çà ne change pas non plus tous les jours çà) Enfin je verrai :wink:

Et puis j’ai un autre souçi là je ne trouve pas comment affecter le nom d’une balise. Voici ma classe qui est sensé retourner un rectangle :

[code]namespace SvgProcessor
{
public class SvgRectangle : XmlElement
{
public SvgRectangle(int width, int height)
{
this.Name = « rect »; // Impossible : READONLY
this.SetAttribute(« width », width.ToString());
this.SetAttribute(« height », height.ToString());
}

}

}[/code]

Comment faire ? (C’est vraiment un truc de newb je sais :stuck_out_tongue:

[quote=“EzecKiel, post:9, topic: 26553”][code]namespace SvgProcessor
{
public class SvgRectangle : XmlElement
{
public SvgRectangle(int width, int height) : base (“rect”)
{
this.SetAttribute(“width”, width.ToString());
this.SetAttribute(“height”, height.ToString());
}

}

}[/code]

Comment faire ? (C’est vraiment un truc de newb je sais :P[/quote]

Edition ci dessus, au pif complet, mais bon… c’est pas ca ou un truc approchant?

Alors j’ai regardé dans la doc. Les arguments sont :

string prefix, string localName, string namespaceURI, XmlDocument doc

J’ai un petit souci pour « référer » au XmlDocument doc dans mon programme :

Voici le fichier program.cs :

[code]using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace SvgProcessor
{
class Program
{
public static void Main(string[] args)
{
SvgDocument svgDoc = new SvgDocument();
SvgRectangle svgRect = new SvgRectangle(100,100);

		svgDoc.AddShape(svgRect);

		svgDoc.Save(@"c:\test.xml");
	}
}

}[/code]

et maintenant le fichier SvgRectangle.cs :

[code]using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace SvgProcessor
{
public class SvgRectangle : XmlElement
{
public SvgRectangle(int Width, int Height) : base (« rect »,"","", doc) // QUE DOIS-JE METTRE A LA PLACE DE DOC ?
{
this.SetAttribute(« width », Width.ToString());
this.SetAttribute(« height », Height.ToString());
}

}

}[/code]
:stuck_out_tongue:

Le document dans lequel vit le XmlElement, et tu peux pas juste ignorer prefix et namespace.

Hop bon finallement j’ai mis le document Xml en paramètre :

public SvgRectangle(int Width, int Height, SvgDocument doc) : base (null,"rect",null,doc) { this.SetAttribute("width", Width.ToString()); this.SetAttribute("height", Height.ToString()); }

Et puis oui j’ai ignoré les préfixes et namespaces. Merci :stuck_out_tongue:

J’en profite pour remettre les liens de Tzim, perdu dans un thread, au sujet des vidéos microsoft (en anglais).

Moi j’avais commencé à regarder pour la programmation objet et j’avais trouvé cela bien expliqué. Peut être en sera-t-il de même avec celle parlant de xml.

[quote]Lesson 1: Getting Started with Visual C# 2005 Express Edition
Lesson 2: Creating a Windows Application User Interface
Lesson 3: Writing Code to Handle Events and Set Properties
Lesson 4: Working with Variables, Expressions, Statements, and Operators
Lesson 5: Using Branching and Recursion
Lesson 6: Object Oriented Programming Fundamentals
Lesson 7: Getting to Know the .NET Framework
Lesson 8: Obtaining Data from a SQL Server 2005 Express Edition Database
Lesson 9: Databinding Data to User Interface Controls
Lesson 10: Working with XML
Lesson 11: Handling Exceptions
Lesson 12: The RSS Reader Project - Designing and Planning
Lesson 13: The RSS Reader Project - Building the UI
Lesson 14: The RSS Reader Project - Working with XML and SQL Server 2005 Express Edition Data
Lesson 15: The RSS Reader Project - Expanding and Refining Application Functionality
Lesson 16: The RSS Reader Project - Fortifying, Testing and Deploying the Application
These lessons provided and built by: www.learnvisualstudio.net[/quote]

[quote=“Tzim, post:36, topic: 25995”]Allez, ca prends du temps, mais c’est un bon moyen d’apprendre, surtout pour les feignasses : la Vidéo !

http://msdn.microsoft.com/vstudio/express/…ng/default.aspx

C’est orienté total débutant, donc j’ai pas tout regardé, mais ca a l’air bien foutu. Le lien est dans la start page de visual C# express…

Oh, et si comme moi, vous aimez garder les fichiers d’install sous le coude, et vous n’aimez pas les installations en ligne, vous pouvez télécharger des images des CDs d’install là :
http://msdn.microsoft.com/vstudio/express/support/install/[/quote]

[quote=“phili_b, post:14, topic: 26553”]J’en profite pour remettre les liens de Tzim, perdu dans un thread, au sujet des vidéos microsoft (en anglais).

Moi j’avais commencé à regarder pour la programmation objet et j’avais trouvé cela bien expliqué. Peut être en sera-t-il de même avec celle parlant de xml.[/quote]

Merci !!! je commence à visionner maintenant !

Glop ?! Est-ce que tu sais s’il existe des vidéos comme cela pour web .Net ? Je suis allé sur le site de microsoft et je n’ai rien trouvé. Il y en a certes sur www.learnvisualstudio.net, l’éditeur de ces formations, mais elles sont payantes.