2012-11-13 2 views
2

을 반환하고 또 다른 XML 비 직렬화 질문을 반환합니다.XML 비 직렬화는 빈 배열

다른 여러 스레드를 검사하고 거기서 대부분의 솔루션을 시도했지만 아무 소용이 없습니다. 내가받은 XML은 modded하게 (또는 적어도 쉽게) 할 수없는 여기있다 :

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<ActueleVertrekTijden> 
    <VertrekkendeTrein> 
     <RitNummer>37047</RitNummer> 
     <VertrekTijd>2012-11-13T15:40:00+0100</VertrekTijd> 
     <EindBestemming>Sneek</EindBestemming> 
     <TreinSoort>Stoptrein</TreinSoort> 
     <Vervoerder>Arriva</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">3</VertrekSpoor> 
    </VertrekkendeTrein> 
    <VertrekkendeTrein> 
     <RitNummer>10558</RitNummer> 
     <VertrekTijd>2012-11-13T15:46:00+0100</VertrekTijd> 
     <EindBestemming>Rotterdam Centraal</EindBestemming> 
     <TreinSoort>Intercity</TreinSoort> 
     <RouteTekst>Heerenveen, Steenwijk, Utrecht C</RouteTekst> 
     <Vervoerder>NS</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">4</VertrekSpoor> 
    </VertrekkendeTrein> 
    <VertrekkendeTrein> 
     <RitNummer>37349</RitNummer> 
     <VertrekTijd>2012-11-13T15:59:00+0100</VertrekTijd> 
     <EindBestemming>Groningen</EindBestemming> 
     <TreinSoort>Sneltrein</TreinSoort> 
     <RouteTekst>Buitenpost</RouteTekst> 
     <Vervoerder>Arriva</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">5b</VertrekSpoor> 
    </VertrekkendeTrein> 
</ActueleVertrekTijden> 

이 더 많은 요소 (10 항상 minumum) 이제

있다이 내가 수업은 비 직렬화 :

[Serializable, XmlRoot(ElementName="ActueleVertrekTijden", DataType="VertrekkendeTrein", IsNullable=false)] 
public class ActueleVertrekTijden 
{ 
    [XmlArray("ActueleVertrekTijden")] 
    public VertrekkendeTrein[] VertrekLijst { get; set; } 
} 

[Serializable] 
public class VertrekkendeTrein 
{ 
    [XmlElement("RitNummer")] 
    public string RitNummer { get; set; } 
    [XmlElement("VertrekTijd")] 
    public string VertrekTijd { get; set; } 
    [XmlElement("EindBestemming")] 
    public string EindBestemming { get; set; } 
    [XmlElement("Vervoerder")] 
    public string Vervoerder { get; set; } 
    [XmlElement("VertrekSpoor")] 
    public string VertrekSpoor { get; set; } 
} 

당분간 다른 것들은 생략했습니다. XmlRoot 부분에 "xmlsn ="오류가있어서 추가했습니다. 그래서 XmlRoot를 설정해야했습니다. 이제

디시리얼라이저 :

 public ActueleVertrekTijden Deserialize<ActueleVertrekTijden>(string s) 
    { 
     var ser = new XmlSerializer(typeof(ActueleVertrekTijden)); 
     ActueleVertrekTijden list = (ActueleVertrekTijden)ser.Deserialize(new StringReader(s)); 

     return list; 
    } 

그것은 ActueleVertrekTijden 클래스를 반환 않습니다하지만 VertrekLijst 배열은 배열 요소가 컨테이너 ActueleVertrekTijden 바로 아래에 표시되기 때문에 당신은 래퍼 네임 스페이스를 생략 할 필요가

+0

[XmlElement("VertrekkendeTrein")] public VertrekkendeTrein[] VertrekLijst { get; set; } 

에 내가 잘못 될 수 변경,하지만 난 당신이 그에게 XmlRoot''의'DataType' 속성을 설정하려는 생각하지 않습니다. 'ElementName' 만 설정할 수 있습니까? 나는 그것을 반드시 고칠 것이라고 생각하지 않지만, 단지 그것을 알아 차렸다. –

+3

외부 XML을 deserialize하려고 할 때 문제가 발생하면 클래스 표현을 직렬화하려고 시도하고 실제로받는 외부 XML과 비교하려고합니다. .NET XmlSerializer가 어떻게 작동하는지에 대한 사소한 혼란 또는 감독/건망증이 종종 있습니다. 애플리케이션과 함께 데이터로'ActueleVertrekTijden' 샘플을 생성하고, XML로 직렬화하고, deserialize하려고하는 소스 XML과의 차이점을 비교해보십시오. –

+0

그건 좋은 생각이야. (왜 내가 그 생각을하지 않았는가). –

답변

2

널 남아 클래스, 컬렉션 없음 wrapper 요소. 즉

[XmlArray("ActueleVertrekTijden")] 
public VertrekkendeTrein[] VertrekLijst { get; set; } 

참조 here

+1

감사합니다. 다른 스레드에서 언급 된 것과 같습니다 : "How counter intuitive!" 아주 빨리 (아마도 시행 착오 후 P : –