2011-10-06 6 views
0

에서 원치 않는 텍스트를 제거 내가 XML로 직렬화 할 객체를 가지고 있고 나는 이것을 수행하기 위해 다음 코드를 사용하고 있습니다 :XML에 객체 직렬화 및 XML

public static string Serialize(object obj) 
    { 
     using (var memoryStream = new MemoryStream()) 
     using (var reader = new StreamReader(memoryStream)) 
     { 
      var serializer = new DataContractSerializer(obj.GetType()); 
      serializer.WriteObject(memoryStream, obj); 
      memoryStream.Position = 0; 
      return reader.ReadToEnd(); 
     } 
    } 

을하고 내가 할 때, 내가 얻을 다음 XML :

<TestRequestPOCO xmlns=\"http://schemas.datacontract.org/2004/07/GPTR.Model.POCOs\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"> 
    <AdditionalInformation>Additional Information</AdditionalInformation> 
    <AddressLine1>6 MOUNT PLEASANT ROAD</AddressLine1> 
    <AddressLine2>LEEDS</AddressLine2> 
    <AddressLine3 i:nil=\"true\"/> 
    <AddressLine4 i:nil=\"true\"/> 
    <AntibioticTherapy i:nil=\"true\"/> 
    <ClinicalInformation>Clinical Information</ClinicalInformation> 
    <ClinicalInformationXml i:nil=\"true\"/> 
    <Clinician>Dr NM BRYAN</Clinician> 
    <ClinicianCode>4203845</ClinicianCode> 
    <ClinicianShortCode :nil=\"true\"/> 
    <Destination>1</Destination> 
    <Dob>1992-02-29T00:00:00</Dob> 
    <ExpectedDate>2011-10-06T10:22:57.096+01:00</ExpectedDate> 
    <FirstName>ALISON</FirstName> 
    <GenerateOrder>true</GenerateOrder> 
    <HospitalNumber i:nil=\"true\"/> 
    <IsFasting>false</IsFasting> 
    <IsPrivatePatient>false</IsPrivatePatient> 
    <IsSensitive>false</IsSensitive> 
    <IsUrgent>false</IsUrgent> 
    <Items> 
     <RequestDataItem> 
      <AdditionalInfo i:nil=\"true\"/> 
      <Container i:nil=\"true\"/> 
      <Description>Ferritin [Serum]</Description> 
      <LIMSDeptName>CHM</LIMSDeptName> 
      <ProfileNumber>1293</ProfileNumber> 
      <QualifierCode i:nil=\"true\"/> 
      <SiteCode i:nil=\"true\"/> 
      <SpecimenType>Serum</SpecimenType> 
      <UniqueTest>False</UniqueTest> 
     </RequestDataItem> 
    </Items> 
    <Location>0</Location> 
    <LocationName>The INPS Practice</LocationName> 
    <LocationShortCode>W97046</LocationShortCode> 
    <LocationTelephone>01792602898</LocationTelephone> 
    <MiddleName i:nil=\"true\"/> 
    <NhsNumber>5240022631</NhsNumber> 
    <OrgCode>RRS</OrgCode> 
    <Placer>Dr Sarah Saturn</Placer> 
    <PostCode>CF31 5EP</PostCode> 
    <Sex>Male</Sex> 
    <Source>GPTR</Source> 
    <SurName>WILLIAMS</SurName> 
    <TelephoneNumber>01792776776</TelephoneNumber> 
</TestRequestPOCO>" 

당신이 볼 수 있듯이, 그것은 잘 빈 태그를 처리하지 않습니다 또한 나는 이런 식으로 뭔가 끝낼 수 있도록 루트 태그의 텍스트를 제거 할 :

<TestRequestPOCO> 
    <AdditionalInformation>Additional Information</AdditionalInformation> 
    <AddressLine1>6 MOUNT PLEASANT ROAD</AddressLine1> 
    <AddressLine2>LEEDS</AddressLine2> 
    <AddressLine3/> 
    <AddressLine4/> 
    <AntibioticTherapy> 
    <ClinicalInformation>Clinical Information</ClinicalInformation> 
    <ClinicalInformationXml/> 
    <Clinician>Dr NM BRYAN</Clinician> 
    <ClinicianCode>4203845</ClinicianCode> 
    <ClinicianShortCode/> 
    <Destination>1</Destination> 
    <Dob>1992-02-29T00:00:00</Dob> 
    <ExpectedDate>2011-10-06T10:22:57.096+01:00</ExpectedDate> 
    <FirstName>ALISON</FirstName> 
    <GenerateOrder>true</GenerateOrder> 
    <HospitalNumber/> 
    <IsFasting>false</IsFasting> 
    <IsPrivatePatient>false</IsPrivatePatient> 
    <IsSensitive>false</IsSensitive> 
    <IsUrgent>false</IsUrgent> 
    <Items> 
     <RequestDataItem> 
      <AdditionalInfo/> 
      <Container/> 
      <Description>Ferritin [Serum]</Description> 
      <LIMSDeptName>CHM</LIMSDeptName> 
      <ProfileNumber>1293</ProfileNumber> 
      <QualifierCode/> 
      <SiteCode/> 
      <SpecimenType>Serum</SpecimenType> 
      <UniqueTest>False</UniqueTest> 
     </RequestDataItem> 
    </Items> 
    <Location>0</Location> 
    <LocationName>The INPS Practice</LocationName> 
    <LocationShortCode>W97046</LocationShortCode> 
    <LocationTelephone>01792602898</LocationTelephone> 
    <MiddleName /> 
    <NhsNumber>5240022631</NhsNumber> 
    <OrgCode>RRS</OrgCode> 
    <Placer>Dr Sarah Saturn</Placer> 
    <PostCode>CF31 5EP</PostCode> 
    <Sex>Male</Sex> 
    <Source>GPTR</Source> 
    <SurName>WILLIAMS</SurName> 
    <TelephoneNumber>01792776776</TelephoneNumber> 
</TestRequestPOCO>" 

누구나 내가 이것을 제거하고 위의 XML 문자열을 생각해 낼 수있는 아이디어가 있습니까?

미리 감사드립니다.

답변

2

'null'값 (즉, i : nil이 true로 설정된 값)을 제거하려면 해당 데이터 멤버의 DataMemberAttribute에서 'EmitDefaultValue'를 false로 설정해야합니다. .NET Framework에서 형식에는 기본값이라는 개념이 있습니다. 예를 들어, 모든 참조 유형에 대한 기본값은 null이며, 정수 유형이 여기에 0

인 예입니다 :

[DataContract] 
public class Employee 
{ 
    // The CLR default for as string is a null value. 
    // This will be written as <employeeName xsi:nill="true" /> 
    [DataMember] 
    public string EmployeeName = null; 

    // This will be written as <employeeID>0</employeeID> 
    [DataMember] 
    public int employeeID = 0; 

    // The next three will not be written because the EmitDefaultValue = false. 
    [DataMember(EmitDefaultValue = false)] 
    public string position = null; 
    [DataMember(EmitDefaultValue = false)] 
    public int salary = 0; 
    [DataMember(EmitDefaultValue = false)] 
    public int? bonus = null; 

    // This will be written as <targetSalary>57800</targetSalary> 
    [DataMember(EmitDefaultValue = false)] 
    public int targetSalary = 57800; 
} 

나는이 작업을 수행하기 전에 신중하게 생각하게 것입니다. 그 이유는 EmitDefaultValue가 false로 설정된 경우 스키마에서 Windows Communication Foundation (WCF)에 한정된 주석으로 표시되기 때문입니다. 이 정보를 나타낼 수있는 상호 운용 가능한 방법은 없습니다. 특히 스키마의 "기본"특성은이 용도로 사용되지 않으며 minOccurs 특성은 IsRequired 설정의 영향을받으며 nillable 특성은 데이터 멤버의 유형에만 영향을받습니다. 다양한 다른 외부 XML 속성을 제거로

, 당신은 완전히를 제거하지 않을 수 있지만, 다음 코드 같은 것을 당신이이 최상위 수준에 한 번만 방출되도록 도움이 될 수

공지 방법 강조 표시된 네임 스페이스는 5 번 정의되어 최상위 수준에서 한 번 정의 될 수있을 때 많은 팽창을 생성합니다. 이 문제를 해결하려면 다음 코드를 사용하십시오.

ser.WriteStartObject(writer, o);  
writer.WriteAttributeString("xmlns", "p", null, "some-reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally-long-namespace.com/");  
ser.WriteObjectContent(writer, o);  
ser.WriteEndObject(writer);