2011-02-16 37 views
2

我有一個C#類,如下所示:類到XML在C#

class CoverageInfo { 
    public string className; 
    public int blocksCovered; 
    public int blocksNotCovered; 

    public CoverageInfo(string className, int blocksCovered, int blocksNotCovered) 
    { 
     this.className = className; 
     this.blocksCovered = blocksCovered; 
     this.blocksNotCovered = blocksNotCovered; 
    } 
} 

而且,我有一個List,模塊名,BlocksCovered/BlocksNotCovered變量。 在這些信息中,我需要按如下所示創建一個XML文件。

<Coverage> 
    <Module> 
    <ModuleName>hello.exe</ModuleName> 
    <BlocksCovered>5</BlocksCovered> 
    <BlocksNotCovered>5</BlocksNotCovered> 
    <Class> 
     <ClassName>Fpga::hello</ClassName> 
     <BlockCovered>5</BlocksCovered> 
     <BlocksNotCovered>2</BlocksNotCovered> 
    </Class> 
    <Class> 
     ... 
    </Class> 
    </Totalcoverage> 
</Coverage> 

我該怎麼用C#做到這一點?

回答

3

有了這樣一個簡單的例子,我將使用帶有XML序列化屬性的XmlSerializer

一個很好的教程,這裏提供:

http://www.codeproject.com/KB/XML/GameCatalog.aspx

我會勸你在未來的使用性能,而不是成員,你會在實現鉤子更靈活或分化獲取/設置訪問權限。 (不過後者必須保持公開,如果你仍然想使用XML屬性或你必須切換到執行IXmlSerializable

然後,代碼應該是這樣的,你的情況:

class CoverageInfo { 
    [XmlElement("ClassName")] 
    public string className; 
    [XmlElement("BlockCovered")] 
    public int blocksCovered; 
    [XmlElement("BlocksNotCovered")] 
    public int blocksNotCovered; 

    .... 
} 

這項工作隨後由XmlSerializer

0

您可以使用XSD.EXE(提供與Visual Studio)基因(如果你有xsd文件,它會更好)。該命令是:

xsd <path to xsd or xml> /c /o:<path where the cs file is saved> 

然後,只需創建要保存爲XML對象的列表,並做一些與此類似:

GetEntityXml(coverageInfo).Save(@"D:\out.xml"); 

其中coverageInfo是List<CoverageInfo>和GetEntityXml 是:

public XmlDocument GetEntityXml<T>(List<T> listToSave) 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    XPathNavigator nav = xmlDoc.CreateNavigator(); 
    using (XmlWriter writer = nav.AppendChild()) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute("Whatever you need")); 
     ser.Serialize(writer, listToSave); 
    } 
    return xmlDoc; 
} 

Credit其中信貸到期。