2011-10-06 117 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中,類型具有默認值的概念。例如,對於任何引用類型的默認值是零,而對於整數類型爲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)的註釋。沒有可互操作的方式來表示這些信息。特別是,模式中的「default」屬性不用於此目的,minOccurs屬性僅受IsRequired設置的影響,而nillable屬性僅受數據成員類型的影響。

作爲去除各種其他外來XML屬性,你永遠無法完全刪除它,而是要像下面的代碼可以幫助您確保這是在頂層發射只有一次:

注意如何突出顯示的名稱空間被定義了五次,當它只能在頂層定義一次時,會產生很多膨脹。要解決此問題,您可以使用以下代碼:

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