[C# 2][XML] Application qui utilise un fichier XML

Voilà, je dois créer un document listant un ensemble d’attaques avec pour chaque attaque un ID, un nom, une catégorie, etc.

Je me suis dit, histoire de me simplifier la tâche et surtout pouvoir avoir quelque chose qui puisse ensuite être recherchable et affichable sur une page web facilement, que j’allais créer un fichier XML contenant ces attaques et une application qui permet de m’ajouter des attaques facilement, puis de ressortir un fichier Word avec ces attaques mises en forme joliement.

Les problèmes que j’ai sont les suivants :

  1. Comment faire pour lire un fichier XML depuis une application fenêtrée? En ASP.Net j’avais utilisé un XmlDataSource pour accéder à des fichiers XML, mais… ça n’existe pas dans les applications classiques… Est-ce que qqn a un tutorial ou un site qui explique comment faire?

  2. Comment créer depuis le fichier XML un document word?

  3. Est-ce que le schéma XML que j’ai créé vous semble correct? (Le schéma : [attachment=882:attachment] Le document utilisant ce schéma [attachment=883:attachment]).

Merci d’avance

Moi généralement j’utilise XmlDocument.Load et après je fais du SelectNodes dedans.

Ouais ok, mais là tu fais tout à la main en fait. Moi ce que j’aurais aimé faire c’est faire un peu ce qui est fait dans ce tutorial mais en utilisant un schéma XML fait moi-même.

Mais tu veux en faire quoi de tes données du coup ? Les binder a un datagrid ou un truc du genre ?

Oui, exactement, les binder à un datagrid et pouvoir les afficher/modifier/ajouter simplement.

Et dans un deuxième temps récupérer ces données et les exporter dans un document Word bien formaté.

Tu peux loader ca directement dans un DataSet a priori selon ton schema. Voire un strongly typed dataset dont tu aurais genere la structure a partir de ton schema, ce qui serait encore plus pratique.

Alors, avec une 'tite recherche google, on trouva ca dans la msdn. J’espere que ca pourra t’aider.

Alors effectivement c’est ce que j’aimerais faire, le strong typed dataset. Mais comment le faire à partir d’un schéma créé à l’extérieur de VS? Parce que j’ai réussi à le faire sans problème en utilisant le Dataset designer. Mais je n’ai pas compris comment faire pour le reprendre depuis un schéma créé à l’extérieur (dans un fichier xsd).

D’ailleurs à ce propos, j’ai refait mon schéma et j’ai une autre question concernant les schémas XML. Dans ma première version, j’avais utilisé la syntaxe de schéma XML de Microsoft, à savoir urn:schemas-microsoft-com:xml-data.
Maintenant j’ai refait ce schéma en utilisant la syntaxe du W3 ([b]http://www.w3.org/2001/XMLSchema[/b]).

J’ai pu ainsi faire d’une manière plus propre que ce que j’avais fait auparavant la gestion du multilangage. Je me suis inspiré de cette page en utilisant la méthode content oriented.

Le problème, c’est que j’aimerais obliger l’utilisation du français et de l’anglais, en gardant la possibilité d’ajouter d’autres langues dans mon fichier XML.
Par exemple :

<?xml version="1.0" encoding="UTF-8"?> <record xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:title xml:lang="fr"/> <dc:title xml:lang="en"/> <dc:title xml:lang="autre"/> </record>

Où le titre en français et en anglais seraient obligatoires et où on pourrait ajouter d’autres langues.
D’après ce site c’est malheureusement impossible avec la syntaxe du W3. Mais on peut s’y approcher en obligeant à avoir deux langues et que chaques langues soient uniques.

C’est justement cette dernière clause que je n’arrive pas à réaliser, l’unicité de la langue.

J’ai essayé en utilisant la clause unique (voir ci-dessous) mais ça n’a pas l’air de fonctionner.

<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="www.heig-vd.ch" xmlns:NS="www.heig-vd.ch" targetNamespace="www.heig-vd.ch" elementFormDefault="qualified"> <xs:element name="Attacks"> <xs:complexType> <xs:sequence> <xs:element name="Attack" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="AttackID" type="xs:string" maxOccurs="unbounded"/> <xs:element name="Name" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Source" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Target" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Goal" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Category" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Type" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Realisation" type="multilingue" maxOccurs="unbounded"/> <xs:element name="Solution" type="multilingue" maxOccurs="unbounded"/> <xs:element name="InformationSources"> <xs:complexType> <xs:sequence> <xs:element name="InformationSource" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Description" type="multilingue" maxOccurs="unbounded"> <xs:unique name="langueDescription"> <xs:selector xpath="Description"/> <xs:field xpath="@lang"/> </xs:unique> </xs:element> <xs:element name="URI" type="xs:anyURI"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="multilingue"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="lang" type="xs:language" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:schema>

Sinon, bishop merci pour le liens, mais j’avais déjà trouvé cet article dans le MSDN et effectivement j’arrive à charger dans le dataset le fichier XML, mais il le fait d’une manière étrange. Si je le bind à un GridView, je n’ai que AttackID qui s’affiche comme colonne.

Si je lance le débug et que je regarde le DataSet avec le DataSet Visualizer en mettant un breakpoint juste après le MyDataSet.readXML() je vois que j’ai un dataset qui contient une table Attack, une table Name, une table Source, etc…

Je ne sais pas trop comment mettre ensemble ces tables afin de faire un affichage correct.

Merci

Edit : Alors j’ai trouvé cette page MSDN qui explique comment faire pour créer un strong typed dataset… mais ça ne fonctionne pas, ils disent de choisir « create dataset » depuis le menu Schema… mais j’ai pas cette option dans le menu Schema.

Bon, alors j’ai réussi à résoudre un des problèmes, c’est à dire que j’ai réussi à créer un strong typed dataset à partir de mon schéma. Je ne comprends pas pourquoi le menu Schema > Generate DataSet n’existe pas dans mon Visual Studio (Visual Studio 2005 Professional version finale).

Enfin, grâce à cette page de la MSDN j’ai réussi à faire ça à la main depuis le command prompt (génial d’ailleurs l’idée de mettre un SDK Command Prompt dans le menu démarrer, super pratique).

Bref, j’ai réussi à créer mon strong typed DataSet, et il semble fonctionner correctement.

Le soucis c’est qu’il est toujours reconnu comme ayant tout un tas de tables différentes et je ne comprends vraiment pas comment faire pour “merger” ces tables… on peut faire une requête SQL dans un DataSet?

Histoire d’illustrer, voilà

L’ensemble des tables… le schéma est toujours le même que celui de mon post précédent… Est-ce que c’est mon schéma qui joue pas?

Ca doit être un truc tout simple, mais j’ai vraiment de la peine à comprendre le fonctionnement… ça me semble tellement plus simple en ASP.Net, comprend pas pourquoi ils ont pas fait le même système…

En fait, le menu Schéma tu l’a que quand tu crées un… XML Schéma. Sauf que c’est pas du tout ce que tu veux faire toi, tu veux faire un DataSet. Alors… bah tu fais un DataSet :

Après tu fais tes tables, tu ajoutes tes champs. Ca doit ressembler a un truc comme ça :

Quand tu crées un DataSet, le fond est bleu, pour les Schéma il est jaune. Tu noteras qu’il génère tout seul le code qui va bien dans la liste à droite. Suffit enfin de s’en servir :

Rien de bien sorcier, on instancie, on load.

Après tu va surement vouloir jouer avec tes tables, tu peux faire des DataView pour ça :

// On cree une dataview pour chacune de nos tables DataView vNet = srvList.Tables["Network"].DefaultView; DataView vSrv = srvList.Tables["Server"].DefaultView;

EDIT :
L’avantage c’ets qu’après, si tu va voir les Data Sources, t’a un truc comme ca :

Si t’a bien selectionné le type de tes champs, tu peux faire des trucs marrant. Un drag’n drop dans un form vide et paf :

Faut avouer que c’est quand même pas trop mal foutu.

L’est chelou ton DataSet, t’a fait une série de tables et c’est surement pas ce que tu cherchais. Regarde comment j’ai fait plus haut. Sinon regarde la doc sur les DataView pour les requètes.