2010-07-09 41 views
1

CLR類型和xsd類型代碼之間是否存在標準(框架)映射? 我需要將字符串,int,小數等轉換爲等效的XmlSchemaSimpleType。從System.Type到xs的類型映射:類型

我可以構造必要的簡單類型並使用case語句來自己完成映射。我希望他們可能是一個標準框架類,可以從各種CLR類型構造XmlSchemaSimpleType,或者甚至可以從CLR類型映射到XmlTypeCode。

System.String - > XmlTypeCode.String(例如)

感謝

UPDATE(07-07-2010) 謝謝,我看過它需要一個小調整的鏈接 - 爲別人,這裏是可以粘貼到linqpad的最終代碼。

public class XmlValueWrapper 
{ 
    public object Value { get; set; } 
} 

public static class XsdConvert 
{ 
    private static XmlSerializer serializer = new XmlSerializer(typeof(XmlValueWrapper)); 


    public static object ConvertFrom(string value, string xsdType) 
    { 
     XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
     XNamespace xsd = "http://www.w3.org/2001/XMLSchema"; 
     XDocument doc = new XDocument(
      new XElement("XmlValueWrapper", 
       new XAttribute(XNamespace.Xmlns + "xsi", xsi), 
       new XAttribute(XNamespace.Xmlns + "xs", xsd), 
        new XElement("Value", 
         new XAttribute(xsi + "type", xsdType), 
         new XText(value)) 
      ) 
     ); 
     doc.Dump("try"); 

     using (var reader = doc.CreateReader()) { 
      XmlValueWrapper wrapper = (XmlValueWrapper) serializer.Deserialize(reader); 
      wrapper.Dump("ITEM"); 
      return wrapper.Value; 
     } 
    } 

} 
    public static void Main() 
    { 
     object o = XsdConvert.ConvertFrom("2010-01-02", "xs:date"); 
     o.GetType().Dump("object"); 
     /* 
     Debug.Assert(Equals(42, XsdConverta.ConvertFrom("42", "xsd:int"))); 
     Debug.Assert(Equals(42.0, XsdConverta.ConvertFrom("42", "xsd:double"))); 
     Debug.Assert(Equals(42m, XsdConverta.ConvertFrom("42", "xsd:decimal"))); 
     Debug.Assert(Equals("42", XsdConverta.ConvertFrom("42", "xsd:string"))); 
     Debug.Assert(Equals(true, XsdConverta.ConvertFrom("true", "xsd:boolean"))); 
     Debug.Assert(Equals(new DateTime(2009, 4, 17), XsdConverta.ConvertFrom("2009-04-17", "xsd:date")));*/ 
    } 

回答