2014-05-05 3 views
1

J'ai créé un modèle de classe qui ressemble à ceci.Comment obtenir un objet fortement typé à partir de xml en utilisant C#?

public class SiteDefinition 
    { 
     [XmlAttribute()] 
     public string Name { get; set; } 
     [XmlAttribute()] 
     public string Version { get; set; } 
     public List<MasterPage>? MasterPages { get; set; } 
     public List<File>? Files { get; set; } 
     public List<PageLayout>? PageLayouts { get; set; } 
     public List<Feature>? Features { get; set; } 
     public List<ContentType>? ContentTypes { get; set; } 
     public List<StyleSheet>? StyleSheets { get; set; } 
    } 

Puis, en utilisant une application de la console, j'ai produit un fichier xml qui ressemble à ceci:

<?xml version="1.0"?> 
<SiteDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="ContosoIntranet" Version="1.0.0.0"> 
    <MasterPages> 
    <MasterPage Url="" Name="seattle.master" LocalFolder=".\seattle.master" ServerFolder="_catalogs/ContosoIntranet/" UIVersion="15" /> 
    </MasterPages> 
</SiteDefinition> 

Code I utilisé:

static void Main(string[] args) 
     { 
      var siteDefinition = new SiteDefinition(); 
      siteDefinition.Name = "ContosoIntranet"; 
      siteDefinition.Version = "1.0.0.0"; 
      siteDefinition.MasterPages = new List<SiteProvisioningFramework.MasterPage>() 
      { 
       new MasterPage(){ 
        Name="seattle.master", 
        ServerFolder ="_catalogs/ContosoIntranet/", 
        UIVersion = "15", 
        Url="", 
        LocalFolder = ".MasterPages/seattle.master" 
       } 
      }; 


      Utilities.XmlHelper.ObjectToXml(siteDefinition, @".\Sample.xml"); 
     } 

Je viens de faire que de savoir comment la xml ressemblerait, dans mon application, les utilisateurs (développeurs), donnera à l'application un fichier xml, puis je veux le convertir en un objet fortement typé: SiteDefinition

Comment puis-je réaliser ceci avec le moins d'effort (lignes) possible?

private void HandleAppInstalled(SPRemoteEventProperties properties) 
     { 
      using (ClientContext cc = TokenHelper.CreateAppEventClientContext(properties, false)) 
      { 
       if (cc != null) 
       { 
        XmlDocument doc = new XmlDocument(); 
        doc.Load(@"/SiteDefinitions/SiteDefinition.xml"); 

       } 
      } 
     } 
+0

-vous _obligatoire_ déjà une définition de classe et juste besoin de désérialiser, ou vous cherchez à _generate_ un à partir du XML? –

+0

Voir ['XmlSerializer'] (http://msdn.microsoft.com/fr-fr/library/system.xml.serialization.xmlserializer.aspx) –

+0

Vous n'allez pas simplifier l'utilisation du XML Serializer ou le sérialiseur de contrat de données. Le mieux que vous puissiez faire est d'utiliser un sérialiseur. –

Répondre

1

Jetez un oeil sur la suite

public class SiteDefinition 
    { 
     [XmlAttribute] 
     public string Name { get; set; } 
     [XmlAttribute] 
     public string Version { get; set; } 
     public List<MasterPage> MasterPages { get; set; } 
     public List<File> Files { get; set; } 

     public List<PageLayout> PageLayouts { get; set; } 
     public List<Feature> Features { get; set; } 
     public List<ContentType> ContentTypes { get; set; } 
     public List<StyleSheet> StyleSheets { get; set; } 
    } 

    public class MasterPage 
    { 
     [XmlAttribute] 
     public string Name { get; set; } 

     [XmlAttribute] 
     public string ServerFolder { get; set; } 

     [XmlAttribute] 
     public string UIVersion { get; set; } 

     [XmlAttribute] 
     public string Url { get; set; } 

     [XmlAttribute] 
     public string LocalFolder { get; set; } 
    } 

    public class StyleSheet 
    { 
    } 

    public class ContentType 
    { 
    } 

    public class Feature 
    { 
    } 

    public class PageLayout 
    { 
    } 

    public class File 
    { 
    } 

    [Fact] 
    public void Test() 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(SiteDefinition)); 
     using (FileStream stream = new FileStream("Data.xml", FileMode.Open)) 
     { 
      var siteDefinition = (SiteDefinition)serializer.Deserialize(stream); 
     } 
    } 

S'il vous plaît noter, cette expression est incorrect type de référence public List<MasterPage>? MasterPages ne peut pas être annulable. Voici plus sur Nullable Types

Et voici les informations supplémentaires sur XML Serialization

+0

merci pour le pourboire! –

+0

quel est cet attribut de fait ?? –

+0

C'est l'attribut xUnit, comme '[Test]' dans le NUnit ou '[TestMethod]' dans le MSTest – GSerjo

Questions connexes