2010-03-14 3 views
1

Voilà le problème: mon entrée est un fichier XML qui ressemble à quelque chose comme:Comment créer un schéma XSD à partir de XML avec ce type de structure (en .net)?

<BaseEntityClassInfo> 
<item> 
    <key>BaseEntityClassInfo.SomeField</key> 
    <value>valueData1</value> 
</item> 
<item> 
    <key>BaseEntityClassInfo.AdditionalDataClass.SomeOtherField</key> 
    <value>valueData2</value> 
</item> 
<item> 
    <key>BaseEntityClassInfo.AdditionalDataClass.AnotherClassInfo.DisplayedText</key> 
    <value>valueData3</value> 
</item> 
... 
... 
</BaseEntityClassInfo> 

L'élément <key> décrit en quelque sorte les classes d'entités champs et les relations (utilisé dans une autre application que je n'ai pas accès) et la <value> stocke les données réelles dont j'ai besoin.

Mon but est de générer par programme un Dataset typé à partir de ce XML qui pourrait ensuite être utilisé pour créer des rapports. J'ai d'abord pensé à construire un schéma XSD à partir du fichier XML d'entrée, puis j'utiliserais ce schéma pour générer le jeu de données, mais je ne suis pas sûr de savoir comment le faire. Le problème est que je ne veux pas toutes les données dans une table, j'ai besoin de plusieurs tables avec des relations basées sur la valeur <key> donc je suppose que je dois déduire la structure relationnelle à partir des données XML <key> d'une certaine façon. Y a-t-il d'autres moyens? Dois-je utiliser XSLT, Linq2XML, autre chose?

Alors, qu'en pensez-vous? Comment cela pourrait-il être fait et quelle serait la meilleure approche?
Tous les conseils, idées, suggestions seraient vraiment apprécié!
Quelqu'un? Il y a quelques informations supplémentaires dans les commentaires ci-dessous ...

+0

Avec quelle version de .NET travaillez-vous? – Pretzel

+0

J'utilise .net 3.5 – Rockcoder

+0

Ugh. Pourquoi dans le monde l'auteur de cette décision a-t-il décidé de mettre en œuvre Entity-Attribute-Value ** en XML **? XML a été largement conçu pour * éliminer * ce genre de gâchis. – Aaronaught

Répondre

1

Malheureusement, vous ne pourrez pas vraiment utiliser d'outils XML pour créer votre Dataset car les données dont vous avez besoin ne sont pas stockées au format XML: elles sont stockées au format que "une autre application" utilise. Si elle ressemblait à:

<BaseEntityClassInfo SomeField="valueData1"> 
    <AdditionalDataClass SomeOtherField="valueData2"> 
    <AnotherClassInfo DisplayedText="valueData3"> 
    </AdditionalDataClass> 
</BaseEntityClassInfo> 

Ensuite, vous pouvez utiliser les gestionnaires XML standard dans .Net, mais étant donné que ce n'est pas, le mieux que vous pouvez faire est de tirer la clé et la valeur comme des paires de chaînes, puis écrivez votre propre code pour analyser la clé dans les entités de données dont vous avez besoin (par exemple, diviser la clé sur les périodes, puis rechercher ou créer des structures de données récursivement).

+1

Il y a un écart considérable entre "ne correspond pas au XML par défaut généré par DataSet" et "n'est pas une donnée au format XML" . –

1

Sans voir toutes vos données, je vais devoir le deviner, mais il semble que le XML pourrait être basé sur une structure de classe comme:

using System; 

[Serializable] 
public class BaseEntityClassInfo 
{ 
    public string SomeField {get; set;} 
    public AdditionalDataClass _AdditionalDataClass {get; set;} 

    public class AdditionalDataClass 
    { 
    public string SomeOtherField {get; set;} 
    public AnotherClassInfo _AnotherClassInfo {get; set;}  
    } 

    public class AnotherClassInfo 
    { 
    public string DisplayedText {get; set;} 
    } 

    public BaseEntityClassInfo BaseEntityClassInfoCreate() 
    { 
     BaseEntityClassInfo instance = 
      new AdditionalDataClass 
      { 
       SomeField = "valueData1", 
       _AdditionalDataClass = 
        new AdditionalDataClass 
         { 
          SomeOtherField = "ValueData2", 
          _AnotherClassInfo = 
           new AnotherClassInfo { DisplayedText = "valueData3" } 
         } 
      }; 
     return instance; 
    } 

} 

... et que la structure de classe est alors sérialisé dans XML.

Cette structure peut être étendue avec vos données réelles et si vous vous retrouvez avec dire

List<BaseEntityClassInfo> 

cela pourrait être la source de données de votre DataSet.

+0

vous avez raison à propos de la structure des classes, mais ce dont j'ai besoin, c'est de construire en quelque sorte un schéma xsd à partir de ce gâchis et pas seulement de remplir le jeu de données avec les données .... – Rockcoder

Questions connexes