2015-02-02 6 views
2

XmlDocument 개체를 깨끗하고 짧은 방법으로 deserialize하려고합니다. 내가 찾은 가장 가까운 것은 this 이었지만, 이미 XmlDocument를 가지고 있기 때문에 (.NET 4.5 또는 4.6에서도)이 작업을 수행 할 수있는 더 좋은 방법이 없는지 궁금합니다. 다음과 같이XmlDocument를 deserialize하는 가장 짧은 방법

그래서 현재이 보인다 : 더 나은 아이디어

// aciResponse.Data is a XmlDocument 
MyClass response; 
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml)))) 
{ 
    var serializer = new XmlSerializer(typeof(MyClass)); 
    response = (MyClass)serializer.Deserialize(reader); 
} 

감사합니다!

+0

당신이 생각하는 바를 '더 멋지다'/ '깨끗한'방법으로 명확히 할 수 있습니까? –

+0

글쎄, 아마도 두 개의 다른 독자를 만들고 열지 않고 InnerXml (문자열)을 사용하는 것과 관련이없는 내용일까요? – silent

+0

이것은 어떤 메소드와 확장 메소드가 필요한지, 만약 당신이 많은 코드를 수행하고 있다면, 함수로 추출하십시오 ... 저 코드는 제게 꽤 간결 해 보입니다. 아마 더 구체적 일 것입니다. –

답변

5

대신 XmlReader을 사용하고 TextReader을 사용하고 TextReaderXmlSerializer.Deserialize Method 오버로드를 사용할 수 있습니다.

근무 예 : 이미 XmlDocument 객체가있는 경우

void Main() 
{ 
    String aciResponseData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag><bar>test</bar></tag>"; 
    using(TextReader sr = new StringReader(aciResponseData)) 
    { 
     var serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass)); 
     MyClass response = (MyClass)serializer.Deserialize(sr); 
     Console.WriteLine(response.bar); 
    } 
} 

[System.Xml.Serialization.XmlRoot("tag")] 
public class MyClass 
{ 
    public String bar; 
} 
+1

글쎄, 적어도 조금 짧은 해결책입니다. 그러나 더 많은 제안이있을 때까지 기다릴 것입니다. – silent

4

이 할 수있는 더 게으른 방법이 있습니다 XmlNodeReader

MyClass response = null; 
XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 
using (XmlReader reader = new XmlNodeReader(aciResponse.Data)) 
{ 
    response = (MyClass)serializer.Deserialize(reader); 
} 
1

사용할 수있는 것보다. 그러나 Visual Studio를 사용하는 경우에만 가능합니다.

단계 :

  1. 열기 Visual Studio 및 (Sample1.cs 말) 새로운 클래스 파일을 만듭니다. 이제 이 클래스 파일에서 샘플 클래스 정의를 제거하십시오.
  2. XML 파일을 클립 보드에 복사하십시오. (Ctrl + A, Ctrl + C)
  3. Visual Studio에서 편집 메뉴로 이동하여 "선택하여 붙여 넣기"-> "XML을 클래스로 붙여 넣기"를 선택하십시오.

완료. Visual Studio는이 XML의 역 직렬화에 필요한 모든 클래스 정의를 생성합니다.