2012-09-09 116 views
0

我試圖定義基於此XML C#對象:什麼是C#中的XML元素和屬性等價物?

<UPDs LUPD="86"> 
    <UPD ID="106"> 
    <ER R="CREn"> 
     <NU UID="1928456" /> 
     <NU UID="1886294" /> 
     <M> 
     <uN>bob · </uN> 
     <mO>fine :D</mO> 
     </M> 

到目前爲止,我有:

public class UDPCollection  
{ 
    List<UDP> UDPs; 

    public UDPCollection() 
    { 
     UDPs = new List<UDP>(); 
    } 
} 

public class UDP 
{ 
    public int Id; 
    public List<ER> ERs; 
    public UDP(int id, List<ER> ers) 
    { 
     Id = id; 
     ERs = ers; 
    } 
} 

public class ER 
{ 
    public string LanguageR; 

    public ER(string languager) 
    { 
     LanguageR = languager; 
    } 
} 

我的問題:什麼做元素地圖在C#?類?什麼屬性地圖?屬性?我正在以正確的方式來解決這個問題嗎?

+0

你爲什麼這樣做?你正在編寫的代碼的目的是什麼?你的標題表明你的方法可能會有些錯誤。 XML是一個文檔。你需要XML數據嗎?閱讀。你需要輸出XML嗎?寫下來。而已。你不需要在對象中鏡像它的結構。 – valentinas

+0

@valentinas - 我收到XML並將其讀入XDocument,現在我想將它映射到c#類和屬性。 –

+1

也許這將有助於:http://stackoverflow.com/questions/87621/how-do-i-map-xml-to-c-sharp-objects – valentinas

回答

1

使用XmlSerializer類和XmlRoot,XmlElementXmlAttribute屬性。例如:

using System.Xml.Serialization; 

... 

[XmlRoot("UPDs")] 
public class UDPCollection 
{ 
    // XmlSerializer cannot serialize List. Changed to array. 
    [XmlElement("UPD")] 
    public UDP[] UDPs { get; set; } 

    [XmlAttribute("LUPD")] 
    public int LUPD { get; set; } 

    public UDPCollection() 
    { 
     // Do nothing 
    } 
} 

[XmlRoot("UPD")] 
public class UDP 
{ 
    [XmlAttribute("ID")] 
    public int Id { get; set; } 

    [XmlElement("ER")] 

    public ER[] ERs { get; set; } 

    // Need a parameterless or default constructor. 
    // for serialization. Other constructors are 
    // unaffected. 
    public UDP() 
    { 
    } 

    // Rest of class 
} 

[XmlRoot("ER")] 
public class ER 
{ 
    [XmlAttribute("R")] 
    public string LanguageR { get; set; } 

    // Need a parameterless or default constructor. 
    // for serialization. Other constructors are 
    // unaffected. 
    public ER() 
    { 
    } 

    // Rest of class 
} 

的代碼寫出來的XML是:

using System.Xml.Serialization; 

... 

// Output the XML to this stream 
Stream stream; 

// Create a test object 
UDPCollection udpCollection = new UDPCollection(); 
udpCollection.LUPD = 86; 
udpCollection.UDPs = new [] 
{ 
    new UDP() { Id= 106, ERs = new [] { new ER() { LanguageR = "CREn" }}} 
}; 

// Serialize the object 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(UDPCollection)); 
xmlSerializer.Serialize(stream, udpCollection); 

這並不是說XmlSerializer的增加了額外的namepsaces,但如果需要,它可以在不把它解析XML。上述的輸出是:

<?xml version="1.0"?> 
<UPDs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" LUPD="86"> 
    <UPD ID="106"> 
     <ER R="CREn" /> 
    </UPD> 
</UPDs> 

使用Deserialize()方法從XML解析到一個對象。

0

XML元素和屬性不一定映射到C#中的任何內容。如果需要,可以將它們映射到類和屬性,但這不是必需的。這就是說,如果你想將你現有的XML映射到某種C#數據結構,你這樣做的方式似乎是合理的 - 我只是建議用實際的屬性替換你的公共字段,也許使得列表屬性是一個不太具體的類型 - 比如說IEnumerable,或者ICollection,或者是IList,如果它們真的需要按順序排列的話。

相關問題