Question

J'aimerais connaître la meilleure méthode pour résoudre ce problème: Je voudrais créer un modèle vierge XML à partir d'un schéma XML. Tous les éléments et attributs requis seraient créés et leurs valeurs seraient toutes des chaînes vides.

La prochaine étape consiste à déterminer les nœuds XML enfant qu’un nœud donné pourrait avoir. par exemple. Je sélectionnerais un nœud a minOccurs = "0", maxOccurs = "illimité". pour l'un de ses enfants. Je serais capable de tout déterminer sur cet enfant, ses attributs, son nom, son type de valeur, etc.

Pour donner plus de contexte à la situation, je travaille sur un outil qui permet aux utilisateurs de modifier des fichiers XML dans un paramètre plus convivial. Par exemple, ils pourraient ajouter un nouveau compte au nœud 'compte db' et verraient que le seul nœud disponible est un nœud de compte. Ensuite, lorsqu'ils essaient d'ajouter des enfants au nœud de compte et que les choix sont nom de nœud (requis), mot de passe (requis), paramètres (facultatif), etc. Comment puis-je déterminer par programme à quels enfants le nœud de compte dispose et quels sont les attributs et les paramètres de ces enfants?

C’est en C # 2.0 avec .NET 2.0.

En résumé, quelles classes dois-je utiliser pour lire un schéma et l’analyser pour obtenir des informations utiles à la création d’un fichier xml? Dans ma naïveté, j’espérais que, puisque xsd était xml en soi, il y aurait une sorte de modèle DOM que je pourrais parcourir.

Je voudrais que cela soit limité à mon programme afin de ne pas utiliser d'outils externes tels que OxygenXml, VS, xsd.exe, etc.

Était-ce utile?

La solution

On dirait que ce que vous voulez faire est de répliquer la fonctionnalité derrière XML intellisense dans la plupart des bons éditeurs XML. C'est-à-dire lire un schéma XML et déterminer quels éléments et attributs peuvent venir ensuite.

Nous avons réalisé quelque chose de très similaire sur un projet sur lequel nous avons travaillé il y a quelque temps. Produire quelque chose qui fonctionne la plupart du temps est beaucoup de travail, produire quelque chose qui fonctionne tout le temps est une charge de travail énorme!

En gros, vous devez charger le fichier XSD (les objets XmlSchema dans .net vous permettent de le faire). Mais le modèle d'objet SOM qu'ils exposent est très brut, vous devez donc effectuer beaucoup de travail pour l'interpréter. Si vous ignorez des concepts tels que les groupes de substitution, l'extension complexType, les schémas de caméléons et les espaces de noms, vous devriez être en mesure de naviguer raisonnablement dans le SOM.

Vous devez ensuite déterminer où vous vous trouvez dans le document XML par rapport à votre schéma. Une fois que vous savez que vous vous trouvez dans le MOS, vous pouvez alors commencer à définir les options disponibles.

Pour le faire correctement, il faut 1 000 pi de lignes de code et 4 à 12 semaines de travail. Vous pourrez peut-être trouver quelque chose de fondamental dans quelques semaines?

Autres conseils

Je me suis fait saigner des yeux avec les documents MSDN et je pense avoir senti un parfum. Chargez un schéma à l'aide de XmlSchema.Read et compilez-le. La propriété Elements contiendra une collection des éléments de 'niveau supérieur'. Vous devrez coder en dur le nom qualifié de l'élément racine ou quelque chose. Alors c'est ça. Je n'ai pas encore trouvé comment trouver le "contenu" sous un élément de schéma donné.

Edit: J'ai trouvé d'autres chemins à parcourir mais ce n'est pas encore clair. XmlSchemaElements a une propriété de type de schéma. C'est simple ou complexe. Les types complexes du schéma xml peuvent avoir des attributs, des séquences, des groupes, etc. Les séquences ont une propriété appelée particule qui peut être un élément. Et le cycle se répète. Mais je pense que la partie difficile dans la mise en œuvre serait de vous assurer de couvrir tous les cas possibles (type simple, type complexe avec attribut, type complexe avec attribut et éléments, extensions, tout ce qui se passe).

Edition: utilisez la propriété Element de l'objet XmlSchema pour obtenir un XmlSchemaElement. Utilisez la propriété SchemaType de XmlSchemaElement pour obtenir un type simple ou complexe. Utilisez la propriété Attribute de XmlSchemaComplexType pour obtenir des attributs ou ContentModel pour obtenir un "contenu simple" / "contenu complexe" ou une particule pour obtenir une "séquence" / "choix" / "tout". En gros, il y a beaucoup de propriétés qui descendent et vérifient les types, qui jettent les objets à gauche et à droite et vérifient toutes les dispositions possibles des objets xsd. Créer une bibliothèque serait long et fastidieux et source d'erreurs. Et ceci est avec les schémas XML, avec les dtd, je ne veux même pas commencer à penser. Wow, les schémas XML sont nécessaires, mais pourquoi doivent-ils être si pervers?

vous pouvez utiliser un outil tiers tel que XMLSPY ( link ). ça va faire un xml factice à partir de xsd ou vice versa.

Une façon très détournée (mais gratuite) d'utiliser les outils .NET existants sur votre ordinateur consiste à utiliser xsd.exe ( link ) pour générer les objets d'entité définis par votre schéma à l'aide de ce qui suit:

xsd /classes /language:CS XSDSchemaFile.xsd

Ensuite, lorsque vous avez les objets, chargez-les dans un projet et sérialisez-les. Vous pouvez renseigner des propriétés, par exemple si vous souhaitez ajouter des données factices.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top