2014-05-05 41 views
1

我創建了一個看起來像這樣的類模型。如何使用c#從xml獲取強類型對象?

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; } 
    } 

然後,使用一個控制檯應用程序,我生成一個XML文件,看起來像這樣:我用

<?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> 

代碼:

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"); 
     } 

我只是這樣做是爲了知道該怎麼在我的應用程序中,xml看起來像用戶(開發人員),會爲應用程序提供一個xml文件,然後我想將其轉換爲強類型對象:SiteDefinition

我怎樣才能以較少的努力(線)實現這一目標?

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

你已經_have_類定義,只是需要反序列化,或者是你希望_generate_一個從XML? –

+0

請參閱['XmlSerializer'](http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer.aspx) –

+0

您不會比使用XML Serializer更簡單或數據合約串行器。他們最好能夠做的就是包裝使用序列化器。 –

回答

1

採取下列的

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); 
     } 
    } 

請注意一看,這種表達是不正確public List<MasterPage>? MasterPages引用類型不能爲空。這裏有更多關於Nullable Types

這裏還有額外的信息關於XML Serialization

+0

感謝您的提示! –

+0

事實屬性是什麼? –

+0

它是xUnit屬性,如NUnit中的[Test]或MSTest中的[TestMethod] – GSerjo