2011-10-17 1 views
3

XmlSerializer를 사용하여 문서를 역 직렬화 제대로XmlSerializer를 사용하여 네임 스페이스로 XML 문서를 비 직렬화하려면 어떻게해야합니까?

문서

<?xml version=\"1.0\"?> 
<ns0:ElementA xmlns:ns0=\"urn:some-namespace\"> 
    <Prop1>Some Value</Prop1> 
    <Prop2>Some other value</Prop2> 
</ns0:ElementA> 

클래스

[XmlRoot(Namespace = "urn:some-namespace")] 
public class ElementA 
{ 
    [XmlElement] 
    public string Prop1 { get; set; } 

    [XmlElement] 
    public string Prop2 { get; set; } 
} 

Prop1 및 Prop2 모두가 직렬화의 끝에 null이 직렬화되지 않습니다.

문서의 구조를 변경하여 네임 스페이스를 제거 할 수 없으므로, 내 측면에서 제대로 deserialization을 처리해야합니다.

문서는 재생의 목적을 위해 단순화 된

나는 ElementA의 속성을 설정해야 제대로 직렬화를 처리하는 방법을

??

- 여기서 문제 재현의 전체 코드입니다 - 나는 그것을 확인하지 않은 이후

namespace ConsoleApplication1 
{ 
    using System; 
    using System.IO; 
    using System.Xml.Serialization; 

    public class Program 
    { 
     [XmlRoot(Namespace = "urn:some-namespace")] 
     public class ElementA 
     { 
      [XmlElement] 
      public string Prop1 { get; set; } 

      [XmlElement] 
      public string Prop2 { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var element = 
       "<?xml version=\"1.0\"?>" + Environment.NewLine + 
       "<ns0:ElementA xmlns:ns0=\"urn:some-namespace\">" + Environment.NewLine+     " <Prop1>Some Value</Prop1>" + Environment.NewLine + 
       " <Prop2>Some other value</Prop2>" + Environment.NewLine + 
       "</ns0:ElementA>"; 

      XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(ElementA) })[0]; 
      ElementA result; 

      using (var reader = new StringReader(element)) 
      { 
       result = serializer.Deserialize(reader) as ElementA; 
      } 

      Console.WriteLine("Prop1: " + result.Prop1); 
      Console.WriteLine("Prop2: " + result.Prop2); 
      Console.ReadKey(); 
     } 
    } 
} 
+2

임의의 생각 - 당신은 속성에'[XmlElement (Namespace = "")]'시도 했습니까? –

+0

@Marc, 정확하게해야 할 일이 있습니다. 답변으로 게시 할 수 있습니다. –

+0

@Darin - 나는 휴대 성을 갖추고 검증 할 수있는 위치에 있지 않았기 때문에 나는 대답으로 게시하지 않았다. (나는 대답에 대해 합리적으로 확신한다.) 당신이 나를 추월하기 전에 나는 지금 겨우 몇 달 남았을 것 같습니다, P –

답변

13

원래, 주석으로 게시,하지만 :

<Prop1>Some Value</Prop1> 

는 아니다 그래서 작업을 얻을 같은

<ns0:Prop1>Some Value</ns0:Prop1> 

, 당신은 아마 필요

[XmlElement(Namespace="")] 
public string Prop1 { get; set; } 

[XmlElement(Namespace="")] 
public string Prop2 { get; set; } 
+0

표시된대로 작동합니다. 네임 스페이스를 설정하지 않은 채로 두는 것이 ""로 설정하는 것과 똑같은 것이라고 잘못 가정했습니다. 분명히, 나는 틀렸다. – angrifel

+0

그리고 신속한 응답에 감사드립니다! – angrifel

+1

@Felipe "not given"은 "element-name에 member-name을 사용하고 부모로부터 네임 스페이스를 상속합니다"를 의미합니다. –