2011-02-16 58 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其中信贷到期。