簡體   English   中英

從外部Xml到C#對象,最簡單的方法是什么?

[英]External Xml to C# Object, what is the easiest way?

我們具有從外部程序生成的XML,需要將其讀取到C#應用程序中。

我知道我們可以使用帶有[Serializable]標記的C#類將對象加載到對象中,但是問題是我們已經擁有比Xml更加面向對象的對象。 我們不想有2套對象。

不過,我可以使用LinqToXml打開文件並填充對象。 這樣行是可行的還是真正的最佳方法是將帶有XmlElementAttribute[Serializable]標簽和其他標簽一起使用到我們的OO模型中? (如果最新的方法是很好的解決方案,那么如何在我的對象內部的對象中放置屬性或使用繼承?)。

編輯:示例

假設我有:

public class Movie {
    public string Name;
    public Actor LeadActor;
}

public class Actor {
    public string Name;
    public DateTime DOB;
}

我想像這樣序列化電影:

<Movie>
    <Name>Casino Royale</Name>
    <LeadActor>Daniel Craig</LeadActor>
</Movie>

我看到使其起作用的唯一方法是將Movie修改為具有LeadActor屬性,該屬性將連接Actor屬性,並使兩個Actor屬性都具有[XmlIgnore]屬性。 但是,如果我不想更改那些業務對象怎么辦?

如果xml數據的結構是已知的(並且不太復雜),那么我發現使用Xml.Linq是最簡單的方法。 每個類都包含公共靜態方法,可以從xml重建自身。 您必須手動執行此操作,但是如果xml結構與看起來像唯一方法的對象結構不對應,那么這很簡單。
以您的示例為例:

public class Movie {
    public string Name;
    public Actor LeadActor;
    public static Movie FromXml (XElement x)
    {
        Movie m = new Movie();
        m.Name = x.Element("Name").Value;
        m.LeadActor = Actor.FromXml(x.Element("LeadActor"));
        return m;
    }
}

public class Actor {
    public string Name;
    public DateTime DOB;
    public static Actor FromXml (XElement x)
    {
        Actor a = new Actor();
        a.Name = x.Value;
        a.DOB = ... 
        return a;
    }
}

[Serializable]屬性啟用了二進制序列化,而不是Xml序列化。 為了支持XML序列化對象,必須具有默認的構造函數和公共可設置屬性。 如果您的對象模型滿足此要求,我會考慮使用內置的XML序列化-從長遠來看,它節省了時間。

您可以使用xslt轉換將源xml轉換為與對象模型匹配的xml格式,然后直接將轉換后的xml反序列化為對象。

您可以在頂級對象上實現IXmlSerializable ,以執行一些自定義序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM