2016-06-20 3 views
2

빈 태그가 포함 된 XML 파일을 비 직렬화하는 솔루션을 찾으려면 도와 주시겠습니까?Xml 빈 태그 역 직렬화

<Report> 
    <ItemsCount></ItemsCount> 
</Report> 

그리고 내가 좋아하는 클래스의 객체로를 직렬화하는 :

예는 여기에 내가 직렬화에 사용하고

public class Report{ 
    public int? ItemsCount { get;set;} 
} 

내 XML 스키마입니다 :

[XmlRoot] 
public partial class Report 
{ 
    private int? itemsCount; 

    [XmlElement(IsNullable = true)] 
    public int? ItemsCount { 
     get 
     { 
      return itemsCount; 
     } 
     set 
     { 
      itemsCount = value; 
     } 
} 

ItemsCount 태그가 전혀없는 경우 제대로 작동하지만, 동시에 존재하고 비어있는 경우 c ase 거기에 라인에 관한 예외를 던지면서이 태그는 xml에 있습니다.

솔루션을 찾기 위해 많은 링크가 있지만 성공하지 못했습니다.

또한 모든 경우에 태그를 무시하고 싶지 않고 대신 null 값을 가져 오려고합니다.

답변

2

XmlSerializer가 string.Empty 태그 값을 정수로 변환하려고하는데 실패했습니다. 문자열 데이터 형식을 변환하기 위해 아래 속성을 변경 :

[XmlElement] 
public string ItemsCount { 
     get 
     { 
      return itemsCount; 
     } 
     set 
     { 
      itemsCount = value; 
     } 

이 위의 경우 비워 재산 Itemscount을 설정합니다. 위의 속성에 대한 null 값에 대한 XML은 다음과 같아야합니다

내 이해에
<ItemsCount xs:Nil='true'/> 
1

이 설명 된 행동이 올바른; 태그 ItemsCount이 누락 된 경우 값은 null입니다. 값이 비어 있으면 ""에서 int? 값으로 변환 할 수 없습니다. 즉, string이어야하는 ItemsCount의 접근 자에 사용자 지정 파싱을 구현할 수 있습니다. 그러나 이것은 나에게 해결 방법처럼 보입니다. 가능하면 문서가 처음부터 변경되어야합니다.

1

이 방법은 어떻습니까? 때문에 XmlIgnore 특성에

public class Report 
{ 
    [XmlIgnore] 
    public int? ItemsCount { get; set; } 
} 

,이 태그는 알 수 없음으로 처리됩니다 다음과 같이

클래스를 정의합니다.
시리얼 라이저는 이벤트 처리기 추가 작성 :

Report report; 
using (var fs = new FileStream("test.xml", FileMode.Open)) 
{ 
    report = (Report)xs.Deserialize(fs); 
} 
:

private void Xs_UnknownElement(object sender, XmlElementEventArgs e) 
{ 
    var report = (Report)e.ObjectBeingDeserialized; 

    if (e.Element.InnerText == string.Empty) 
     report.ItemsCount = null; 
    else 
     report.ItemsCount = int.Parse(e.Element.InnerText); 
} 

평소와 같이 시리얼 라이저를 사용하여 널 (null)로 빈 문자열을 해석하는 이벤트 처리기에서

var xs = new XmlSerializer(typeof(Report)); 
xs.UnknownElement += Xs_UnknownElement;