2016-12-14 2 views
0

해당 기능 중 하나 인 웹 서비스에서 다음 형식의 XML을 받아 들일 수 있어야하고 deserialize 할 수 있어야하는 C# 라이브러리를 작성하고 있습니다. 그들.속성을 속성 또는 요소로 사용할 수있는 C#에서 XML 비 직렬화

양식 1 :

<results> 
    <sample> 
    <status>status message</status> 
    <name>sample name</name> 
    <igsn>unique identifier for this sample</igsn> 
    </sample> 
</results> 

양식 2 :

<results> 
    <sample name="sample name"> 
    <valid code="InvalidSample">no</valid> 
    <status>Not Saved</status> 
    <error>error message</error> 
    </sample> 
</results> 

은 여기가 직렬화 복원하고있어 내 수업입니다 :이다

namespace MyNamespace 
{ 
    [XmlRoot(ElementName = "results")] 
    public class SampleSubmissionResponse 
    { 

     [XmlElement("sample")] 
     public List<SampleSubmissionSampleResultRecord> SampleList { get; set; } 

     ... 
    } 


    public class SampleSubmissionSampleResultRecord 
    { 
    ... 

     /* RELEVANT PROPERTY RIGHT HERE */ 
     [XmlAttribute(Attribute = "name")] 
     [XmlElement(ElementName = "name")] 
     public string Name { get; set; } 

     ... 
    } 

    public class SampleSubmissionValidRecord 
    { 
     ... 
    } 
} 

문제 하나 개 XML 샘플에서, Sample 요소의 name 특성은 요소이고 다른 요소는 특성입니다. XmlAttribute와 XmlElement로 클래스의 속성을 꾸미면 XmlSerializer 인스턴스를 만들 때 예외가 발생합니다.

지금은 좋은 것으로 인터넷 검색을 해오 고 있으며이 상황을 다루는 문서를 찾을 수 없습니다. XML 스키마를 만들 때 동일한 요소의 특성과 자식 요소에 동일한 이름을 사용하지 않아야하기 때문에 이것이 확실하다고 생각합니다.

그래서 여기서 어떻게해야합니까?

하나의 솔루션은 서로 다른 유형에 대해 두 개의 완전히 별개의 모델을 갖는 것일 수 있습니다. 아마도 작동 할 것이지만 매우 우아 해 보이지는 않습니다.

또 다른 옵션은 IXmlSerializable을 구현하고 deserialize 메소드에서이를 처리하는 정교한 코드를 작성하는 것입니다. 그것은 간단한 문제에 대한 매우 장황한 해결책 일 것입니다.

제 3의 옵션 나는 XmlAttribute와 XmlElement를 동일한 속성 또는 동등한 "어느 하나의"속성에 적용하는 몇 가지 방법을 원합니다.

넷째 옵션 : 일관되게 하나의 양식을 사용하기 위해 XML이 제공하는 웹 서비스를 변경하십시오. 불행히도, 그것을 소유 한 사람들은 이것을 기꺼이하지 않을 수도 있습니다.

+0

xmlattribute 및 xmlelement를 사용하여 diffrun 속성을 사용 해본 적이 있습니까? – ITGenius

답변

0

Name 속성에는 하나의 속성 만 지정하십시오. 이렇게하면 첫 번째 XML 양식이 올바르게 구문 분석됩니다.

public class SampleSubmissionSampleResultRecord 
{ 
    [XmlElement(ElementName = "name")] 
    public string Name { get; set; } 
} 

UnknownAttribute 이벤트에 XmlSerializer 가입, 두 번째 XML 양식을 구문 분석합니다.

var xs = new XmlSerializer(typeof(SampleSubmissionResponse)); 
xs.UnknownAttribute += Xs_UnknownAttribute; 

이벤트 처리기에서 원하는 값을 얻습니다.

private void Xs_UnknownAttribute(object sender, XmlAttributeEventArgs e) 
{ 
    var record = (SampleSubmissionSampleResultRecord)e.ObjectBeingDeserialized; 
    record.Name = e.Attr.Value; 
}