13

DatacontractSerializer을 사용하여 내 domainModel을 xml 파일로 직렬화합니다. 다음과 같은 결과가 나옵니다.DataContractSerializer XML 출력에서 ​​"d1p1"네임 스페이스 접두사를 제거하십시오.

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <d1p1:Name z:Id="2">Ankit</d1p1:Name> 
    <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1"> 
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
     <d2p1:Key z:Id="4">key1</d2p1:Key> 
     <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5"> 
     <d4p1:points z:Id="6" z:Size="2"> 
      <d2p1:double>45.5</d2p1:double> 
      <d2p1:double>546.45</d2p1:double> 
     </d4p1:points> 
     </d2p1:Value> 
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
    </d1p1:PointsDictionary> 
</z:anyType> 

는 그리고 나는이 "d1p1"네임 스페이스 접두사를 제거 할 그냥 태그 대신 </d1p1:PointsDictionary> 같은 </PointDictionary>를 원한다. 클래스 속성에 DataMember 특성을 넣으려고했지만 많은 문제가 해결되지 않습니다. 출력 XML 파일은 최종 사용자가 편집 할 수 있으므로 위의 XML 파일과 비교하여보다 깨끗한 XML 파일을 원합니다.

우선 순위는 코드를 통해서만 제어하고 가능한 경우 XSLT 또는 다른 스키마로 이동하는 것입니다.

+0

StackOverflow에 오신 것을 환영합니다. 코드, XML 또는 데이터 샘플을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바의 "코드 샘플"버튼 ('{}) '을 클릭하십시오. 형식 및 구문을 강조 표시하십시오! –

답변

3

DataContractSerializer은 접두어를 제어하지 않습니다. XML Serialization and namespace prefixes에 대한 대답은 네임 스페이스 접두사를 제어하려는 경우 XmlSerializer을 사용하는 것이 좋습니다.

귀하의 도메인 모델에 대한 네임 스페이스 접두사를 완전히 제거할지 여부는 명확하지 않습니다. 위의 샘플에는 d1p1, d2p1, d4p1이라는 네임 스페이스 접두어가 여러 개 있습니다. Changing namespace for XML file in XSL Translation은 XSLT를 사용하여 접두사 이름 바꾸기에 대한 지침을 제공합니다.

+5

XmlSerializer는 DataContractSerializer와 비교하여 두 가지 한계가 있습니다. 인터페이스를 처리하지 않으며 모든 클래스에 매개 변수없는 생성자가 있어야합니다. DataContractSerializer를 사용하고 네임 스페이스 문제를 다루는 다른 방법을 찾는 것이 더 나은 장기 솔루션이라고 생각합니다. – Contango

+0

@Contango, 원칙적으로 동의합니다 ... 예외적으로'DataContractSerializer' *는 (내 경험상) 매개 변수없는 생성자를 필요로합니다. 하나가없는 형식에서 인스턴스를 만들려고하면 런타임 오류가 발생합니다. – harpo

+0

@harpo DataContractSerializer에는 반드시 빈 생성자가 필요하지 않습니다. 넌 뭔가 잘못하고있어. 새로운 질문에 코드를 게시하고 싶다면 검토해보십시오. – Dan

5

빈 네임 스페이스를 사용하면 접두어가 제거 된 것으로 보입니다.

[DataContract(Namespace="")] 
public class MyClass 
{ ... } 

가 그런 경우 빈 문자열 (드)에 네임 스페이스를 설정해야 직렬화 :

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, ""); 
0

당신은 할 수 있어야하는 접두사를 제거하려면 다음 DataContract 속성을 가진 클래스가 설정 XML에 직렬화하려는 클래스가 동일한 네임 스페이스 내에 있는지 확인하는 것만으로 예를 들어 ApplicationListResponse와 Application이라는 두 클래스가 있습니다. 이전에는 네임 스페이스가 Models.Responses 및 Models.Responses.Application이었습니다. 네임 스페이스 모두를 "모델"로 변경했으며 XML 출력의 접두사를 없앴습니다.