2013-04-10 56 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 
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 2013-04-10 15:00:39

+0

你目前如何序列化?看起來像你可以嘗試'[XmlAttribute]',(也請減少你的例子,花了我一段時間來弄清楚什麼是不同的!) – Sayse 2013-04-10 15:02:32

+0

抱歉的粗略解釋...你們都建議產量:當我想 devHead 2013-04-10 15:03:57

回答

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 2013-04-10 16:47:13

+0

它是我發現爲我的情況做到這一點的唯一方法,如果您擔心必須對代碼進行大量更改才能生效,可以使用'[XmlIgnore]'標記在PartInfo中爲這些方法提供PartInfo中的屬性訪問器 – Sayse 2013-04-10 17:21:35