동일한 데이터이지만 태그의 이름이 다른 두 개의 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
나는 공장을 빨리 읽어야했다. 그래서 이것이 틀렸다면 나를 용서해야한다. 이렇게하면 xml 파일에서 여러 가지 다른 방법을 선택할 수 있으므로 짧고 참조가 모두 ONIXMessage에 추가 될 수 있습니까? 복잡한 XML 파일을 deserialise하는 방법에 대한 질문을해야한다고 생각합니다. 그러나 이것이 결국 알아낼 때 유용 할 것입니다. 감사합니다. – Simon
XmlRootAttribute 및 XmlAttributeAttribute 특성 (phew)은 멤버/유형별로 한 번만 적용 할 수 있기 때문에 직선화 된 XML 비 직렬화로이 작업을 수행 할 수 있다고 생각하지 않습니다. –
XML 파일을 처리하는 더 좋은 방법을 찾아야 할 것처럼 보입니다. – Simon