2017-03-09 2 views
0

원격 클라이언트에서 내 응용 프로그램에 값을 보내기위한 XML 인터페이스를 정의하는 데 사용되는 스키마가있는 XSD 파일이 있습니다. 지금 XSD는 3 가지 요소를 단순하게 말합니다.XSD 이전 버전과의 호환성

그래서 이것을 C#에서 직렬화 및 비 직렬화하기 위해 xsd.exe 도구를 사용하여 C# 클래스를 생성하고 이러한 클래스를 사용하여 XSD와 관련하여 XML을 직렬화 및 비 직렬화 할 수 있습니다.

이 작동하지만 일부 새 서버 측 기능을 사용할 수 있도록 새로운 네 번째 요소가있는 XSD의 새 버전을 만들 수 있습니다.이 요소가 새로운 원격 클라이언트에 대해 지정되었지만 여전히 지원하려면 이전 XSD (이전 원격 클라이언트의 소프트웨어를 변경하거나 변경할 수는 없음)가 있지만 새 XSD에서 생성 된 새 클래스는 이전 XSD의 이전 XML과 호환되지 않습니다.

XML을 XDocument 또는 이와 유사한 것으로 직접 읽을 수 있다고 가정하지만 XSD 중 하나에 대해서만 유효성을 검사 할 수있는 XML을 수락하는 기능을 원합니다. (그리고 XSD 버전에 따라 서버 측 결정을받습니다. 그것을 반대하는). 이것은 고객 관계 문제 때문입니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

1

정확하게 이해한다면 스키마에 요소를 추가하기 만하면 여러 개의 XSD를 지원할 필요가 없습니다. 대신이 새 요소에 대해 'minOccurs'값을 0으로 설정하고 CS 파일을 다시 생성하고이를 사용하여 객체의 직렬화를 해제하면 요소가 존재할 때와 없을 때에 대한 요청을 비 직렬화 할 수 있습니다 선물. 그런 다음 비 직렬화 된 객체의 Property가 null인지 여부를 평가하여 새 기능을 활성화할지 여부를 결정할 수 있습니다. 아래의 예 XSD를 참조하십시오.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ClassName" nillable="true" type="ClassName" /> 
    <xs:complexType name="ClassName"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" name="Property1" type="Property1Type" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="Property2" type="Property2Type" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
1

특히 여러 변형을 처리해야하는 경우 스키마가 변경 될 가능성이있는 경우 데이터 바인딩 기술을 피하는 것이 좋습니다. 기본적으로 XML은 C#과 같은 유연성과 언어를 위해 설계되었으므로 특정 스키마를 반영하도록 C# 코드를 컴파일하면 스스로를 잠그고 있습니다. 데이터 바인딩은 아무런 변화가 없으면 좋지만 다양성과 변경을 처리해야하는 경우 그런 다음 일반적인 접근법 (예 : DOM)을 사용하거나 XSLT 및 XQuery와 같은 XML 관련 처리 언어를 사용하십시오.