2013-04-10 2 views
1

Я видел пример, который использует класс оболочки для этого, но мне было интересно, есть ли лучший (более простой) способ.Добавить атрибут XML для сериализованного свойства класса

Мои классы следующим образом: Код

public class PartData 
{ 
    public List<PartInfo> PartList { get; set; } 
} 


public class PartInfo 
{ 
    public string PartNumber { get; set; } 

    public string OEMNumbers { get; set; } 

    public List<VehicleApplication> VehicleApplications { get; set; } 
} 


public class VehicleApplication 
{ 

    public string Year { get; set; } 

    public string Make { get; set; } 

    public string Model { get; set; } 
} 

Serialize:

//serialize 
private void serialize() 
{ 
    PartData p = GetParts(); 
    SerializeClass(p); 
} 

public void SerializeClass(object instance) 
{ 
    var serializer = new XmlSerializer(typeof(PartData)); 

    using (var writer = new StreamWriter("C:\\TestFile.xml")) 
    { 
    serializer.Serialize(writer, instance); 
    } 
} 

когда сериализован я получаю следующий результат:

<PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <PartList> 
    <PartInfo> 
     <PartNumber>12345</PartNumber> 
     <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers> 
     <VehicleApplications> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     </VehicleApplications> 
    </PartInfo> 
    </PartList> 
</PartData> 

В идеале я хотел бы сделать партномер в атрибут:

<PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <PartList> 
    <PartInfo> 
     <PartNumber Id ="12345"> 
     <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers> 
     <VehicleApplications> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     <VehicleApplication> 
      <Year>2001</Year> 
      <Make>Ford</Make> 
      <Model>F150</Model> 
     </VehicleApplication> 
     </VehicleApplications> 
    </Partnumber> 
    </PartInfo> 
    </PartList> 
</PartData> 

Я попытался добавить:

public class PartInfo 
{ 
    [XmlAttribute("Id")] 
    public string PartNumber { get; set; } 

    public string OEMNumbers { get; set; } 

    public List<VehicleApplication> VehicleApplications { get; set; } 
} 

но создает:

<PartInfo Id="12345"> 

, когда мне нужно:

<PartNumber Id="12345"> 
+0

Вы, вероятно, означает ' '(как, нет 'PartNumber' как« обертка »содержимого' PartInfo'). Если это действительно так, просто добавьте свойство '[XmlAttribute]' в 'PartNumber'. – pfyod

+0

как вы сейчас сериализуетесь? похоже, что вы можете попробовать '[XmlAttribute]', (также, пожалуйста, сократите свой пример, потребовалось некоторое время, чтобы выяснить, что было по-другому!) – Sayse

+0

извините за грубое объяснение ... что вы оба предложили: , когда мне захочется devHead

ответ

2

Я думаю, что это единственный способ добиться того, что вы стремятся достичь

public class PartDetail 
{ 
    [XmlAttribute] 
    public string ID{ get; set; } 

    public string OEMNumbers { get; set; } 

    public List<VehicleApplication> VehicleApplications { get; set; } 
} 

public class PartInfo 
{ 
    public PartDetail { get; set; } 
} 

В ответ на ваш первый комментарий, это самый простой способ добиться этого, альтернатива написать собственный сериалайзер

+0

Я изначально имел это в своем первом дизайне, похоже, что это может быть единственный ответ без переопределения класса сериализатора – devHead

+0

Его единственный способ, который я нашел, сделать это для моей ситуации, если вы беспокоитесь о необходимости внесения большого количества изменений в свой код, чтобы сделать эту работу, вы могли бы использовать тег '[XmlIgnore]' для предоставления аксессуаров свойств в PartInfo этим методам в деталях детали – Sayse