2010-06-30 8 views
2

동일한 데이터이지만 태그의 이름이 다른 두 개의 XML 파일이 있습니다. 하나는 참조 태그를 명명하고 다른 하나는 짧은 버전을가집니다.인터페이스 또는 다형성을 사용하여 두 개의 서로 다른 XML 파일을 하나의 객체 유형으로 역 직렬화 할 수 있습니까?

데이터가 정확히 동일하므로이 파일을 객체로 직렬화 할 수 없지만 두 개의 개별 객체를 처리하지 않으려합니다. 내가이이 짧은 태그와 파일의 경우

[XmlRoot(ElementName="Message")] 
public class ONIXMessage 
{ 
    [XmlAttribute(AttributeName="release")] 
    public string Release { get; set; } 

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

    [XmlElement("Product")] 
    public List<Product> Products { get; set; }   
} 

: 내가 생성 한 파일을 다음 클래스를 deserialise하려면

[XmlRoot(ElementName="message")] 
public class ONIXMessage 
{ 
    [XmlAttribute(AttributeName="release")] 
    public string Release { get; set; } 

    [XmlElement("x1")] 
    public Header Header { get; set; } 

    [XmlElement("x2")] 
    public List<Product> Products { get; set; }  
} 

내가 가진 인터페이스를 사용하여 이동 만이 아니었다 머리글과 제품을 올바르게 반환하는 방법을 확실히 알고 있어야합니다. 그것들은 각 버전마다 다릅니다.

XML을 비 직렬화하는 더 좋은 방법이 있습니까? 아니면 이미 가지고있는 것과 함께 할 수 있습니까?

도움을 주시면 감사하겠습니다.

편집 :

단 5 년 밖에 걸리지 않았지만 알아 냈습니다. XmlAttributeOverrides를 사용하면이 작업을 수행 할 수 있습니다.

public interface IMessageReader() 
{ 
    ONIXMessage Read(string xml); 
} 

public static class ONIXMessageFactory 
{ 
    private static IList<IMessageReader> readers = new List<IMessageReader>(); 

    public static ONIXMessage CreateMessage(string xml) 
    { 
     var reader = GetReader(xml); 
     return reader.Read(xml); 
    } 

    public static IMessageReader GetReader(string xml) 
    { 
     // Somehow identify which reader would be required. 
    } 
} 
두 개의 전문 독자를 만들 이로써

사용 : http://www.ikriv.com/dev/dotnet/OverrideXml.shtml

답변

0

인터페이스 아마 공장 인터페이스를 섞어, 그리고 비슷한 작업을 수행한다 .. 내가 할 것이다 갈 수있는 가장 좋은 방법입니다 필요한 리더를 사용하여 메시지 생성을 제어하는 ​​팩토리. 더 까다로운 부분은 사용할 독자를 식별하는 것입니다.

당신이 시작하게되기를 바라는 희망 ...

+0

나는 공장을 빨리 읽어야했다. 그래서 이것이 틀렸다면 나를 용서해야한다. 이렇게하면 xml 파일에서 여러 가지 다른 방법을 선택할 수 있으므로 짧고 참조가 모두 ONIXMessage에 추가 될 수 있습니까? 복잡한 XML 파일을 deserialise하는 방법에 대한 질문을해야한다고 생각합니다. 그러나 이것이 결국 알아낼 때 유용 할 것입니다. 감사합니다. – Simon

+0

XmlRootAttribute 및 XmlAttributeAttribute 특성 (phew)은 멤버/유형별로 한 번만 적용 할 수 있기 때문에 직선화 된 XML 비 직렬화로이 작업을 수행 할 수 있다고 생각하지 않습니다. –

+0

XML 파일을 처리하는 더 좋은 방법을 찾아야 할 것처럼 보입니다. – Simon

관련 문제