2010-06-09 3 views
0

나중에 검색 할 수 있도록 SQL에서 C# .NET 클래스의 인스턴스를 저장하고 싶습니다. SQL에 LINQ를 사용하여 클래스를 구성하는 모든 XML로 레코드를 추가 할 수 있습니다.XML에서 C# 클래스를 다시 작성하는 방법

이제 XML을 검색하고 클래스 객체 인스턴스를 재구성하려면 어떻게해야합니까?

+3

클래스 또는 인스턴스에 대해 이야기하고 있습니까? – mathk

답변

6

XML 문자열로 객체를 직렬화 :

public static T FromXml<T>(string xml) 
    { 
     using (TextReader reader = new StringReader(xml)) 
     { 
      try 
      { 
       return (T)new XmlSerializer(typeof(T)).Deserialize(reader); 
      } 
      catch (InvalidOperationException) 
      { 
       // string passed is not XML, return default 
       return default(T); 
      } 
     } 
    } 
+0

위대한 답변 제시. 이것에 대한 귀하의 도움에 감사드립니다! – mcass20

+0

@ mcass20, 대단히 반갑습니다. 항상 코드와 기술을 공유하는 즐거움. –

0

xml serialization 및 deserialization을 권하고 싶습니다.

Person donald = new Person{ 
       ID=1, 
       FirstName="Donald", 
       LastName="Duck", 
       DateOfBirth=new DateTime(1950,1,1)}; 

//create a xml serializer with the required type 
XmlSerializer xs=new XmlSerializer(typeof(Person)); 

//open a stream to the file, and save the instance 
TextWriter tw = new StreamWriter(@"C:\donald.xml"); 
xs.Serialize(tw, donald); 
tw.Close(); 

//open a reader stream to the file, and just load the instance. 
TextReader tr = new StreamReader(@"C:\donald.xml"); 
Person donald2 = (Person) xs.Deserialize(tr); 
tr.Close(); 

경고 : :이 만 공용 속성/필드를 저장

는 Person 클래스가 정의 내가 한 경우로

public class Person 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

는 XML에서로드 /을 저장은 간단합니다 XML 요소로서의 클래스. 생성 된 XML에 대한 추가 제어를 수행하려면 System.Xml.Serialization 네임 스페이스 (XmlAttributeAttribute가 개인적으로 가장 좋아하는 속성)의 특성을 살펴보십시오.

+0

-1'StreamReader' 주위에서'using' 블록을 사용하지 않기 때문에 -1입니다. –

+0

글쎄, 나는 명시 적으로 독자/작가를 닫고있다. using 블록 안에 변수를 선언 할 때'using'을 사용하는 것이 싫어서 의도적이다. 코드를 읽기 쉽게 만든다. – SWeko

0

XStream을 사용하여 개체를 XML로 저장할 수 있습니다. 꽤 사용하기 쉽습니다.

2

다른 사람이 말할 때, 직렬화가 트릭을 할,하지만 포매터를 알고있을 것입니다 :

public static string ToXml<T>(T obj) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 

     settings.OmitXmlDeclaration = true; 
     using (Stream stream = new MemoryStream()) 
     using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
     { 
      new XmlSerializer(obj.GetType()).Serialize(writer, obj); 
      writer.Flush(); 
      stream.Flush(); 
      stream.Position = 0; 
      using (TextReader reader = new StreamReader(stream)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 

객체로 XML 문자열을 역 직렬화/시리얼, 그렇지 않으면이 :

<?xml version="1.0" encoding="utf-8" ?>

이 직렬화에 포함됩니다. 가능한 경우 DataContractSerializer를 사용하십시오.

무엇이든하기 전에 이것을 .NET XML Serialization without <?xml> text declaration으로 보시기 바랍니다.

HTH

관련 문제