2014-05-05 40 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