C# 从对象(类)c创建xml文件#

C# 从对象(类)c创建xml文件#,c#,xml,C#,Xml,我想创建一个如下所示的xml文件: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0"> <METADATA> <FIELDS> <FIELD WIDTH="8" fieldtype="string" attrname="ID"/> <FIELD WID

我想创建一个如下所示的xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DATAPACKET Version="2.0">
    <METADATA>
        <FIELDS>
           <FIELD WIDTH="8" fieldtype="string" attrname="ID"/>
           <FIELD WIDTH="30" fieldtype="string" attrname="NAME"/>          
        </FIELDS>
        <PARAMS/>
    </METADATA>
    <ROWDATA>
        <ROW ID="00000000" NAME="Peter"/>
        <ROW ID="00000010" NAME="Lucie"/>
    </ROWDATA>
</DATAPACKET>

你知道如何从c#objet(类)创建它吗?如果无法创建此文件,是否有其他解决方案? 谢谢

以下是解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication143
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataPacket dataPacket = new DataPacket()
            {
                metadata = new MetaData()
                {
                    fields = new List<Field>() {
                        new Field() { width = 8, fieldtype = "string", attrname = "ID"},
                        new Field() { width = 30, fieldtype = "string", attrname = "NAME"}
                    }
                },
                rows = new List<Row>() {
                    new Row() { id = "00000000", name = "Peter"},
                    new Row() { id = "00000010", name = "Lucie"}
                }
            };

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(FILENAME, settings);

            XmlSerializer serializer = new XmlSerializer(typeof(DataPacket));
            serializer.Serialize(writer, dataPacket);


        }
    }
    [XmlRoot("DATAPACKET")]
    public class DataPacket
    {
        [XmlAttribute("Version")]
        public string version { get; set; }

        [XmlElement("METADATA")]
        public MetaData metadata { get; set;}

        [XmlArray("ROWDATA")]
        [XmlArrayItem("ROW")]
        public List<Row> rows { get; set; }
    }
    [XmlRoot("METADATA")]
    public class MetaData
    {
        [XmlArray("FIELDS")]
        [XmlArrayItem("FIELD")]
        public List<Field> fields { get; set; }
    }
    [XmlRoot("FIELD")]
    public class Field
    {
        [XmlAttribute("WIDTH")]
        public int width { get; set; }

        [XmlAttribute("fieldtype")]
        public string fieldtype { get; set; }

        [XmlAttribute("Version")]
        public string attrname { get; set; }
    }
    [XmlRoot("ROW")]
    public class Row
    {
        [XmlAttribute("ID")]
        public string  id { get; set; }

        [XmlAttribute("NAME")]
        public string name { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序143
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
数据包数据包=新数据包()
{
元数据=新元数据()
{
字段=新列表(){
新建字段(){width=8,fieldtype=“string”,attrname=“ID”},
新建字段(){width=30,fieldtype=“string”,attrname=“NAME”}
}
},
行=新列表(){
新行(){id=“00000000”,name=“Peter”},
新行(){id=“00000010”,name=“Lucie”}
}
};
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=true;
XmlWriter=XmlWriter.Create(文件名、设置);
XmlSerializer serializer=新的XmlSerializer(类型(数据包));
serializer.Serialize(写入程序、数据包);
}
}
[XmlRoot(“数据包”)]
公共类数据包
{
[XmlAttribute(“版本”)]
公共字符串版本{get;set;}
[XmlElement(“元数据”)]
公共元数据{get;set;}
[XmlArray(“ROWDATA”)]
[XmlArrayItem(“行”)]
公共列表行{get;set;}
}
[XmlRoot(“元数据”)]
公共类元数据
{
[XmlArray(“字段”)]
[XmlArrayItem(“字段”)]
公共列表字段{get;set;}
}
[XmlRoot(“字段”)]
公共类字段
{
[XmlAttribute(“宽度”)]
公共整数宽度{get;set;}
[XmlAttribute(“字段类型”)]
公共字符串字段类型{get;set;}
[XmlAttribute(“版本”)]
公共字符串attrname{get;set;}
}
[XmlRoot(“行”)]
公共类行
{
[XmlAttribute(“ID”)]
公共字符串id{get;set;}
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
}
}

您可以通过在Visual Studio->编辑->特殊粘贴->选择XML中复制此XML测试来创建类,VS将自动创建具有属性的C#类。毕竟,您可以使用XmlSerializer将此类序列化为所需的XML格式。

用于将XML转换为c#模型


请用你尝试过的和不起作用的更新你的帖子。另一方面,它可以通过几种方式实现,如果我们看到您的尝试,我们当然可以帮助您。如果答案出现,他们很可能会固执己见,因为没有代码供我们查看。@AshkanMobayenKhiabani那篇文章已经有将近7年的历史了,没有回答如何从对象生成xml的问题。听起来OP已经有了类,所以我认为这部分没有必要(虽然我想不会痛吧?)。
[XmlRoot(ElementName = "DATAPACKET")]
public class DATAPACKET
{
    [XmlElement(ElementName = "METADATA")]
    public METADATA METADATA { get; set; }
    [XmlElement(ElementName = "ROWDATA")]
    public ROWDATA ROWDATA { get; set; }
    [XmlAttribute(AttributeName = "Version")]
    public string Version { get; set; }
}

[XmlRoot(ElementName = "FIELD")]
public class FIELD
{
    [XmlAttribute(AttributeName = "attrname")]
    public string Attrname { get; set; }
    [XmlAttribute(AttributeName = "fieldtype")]
    public string Fieldtype { get; set; }
    [XmlAttribute(AttributeName = "WIDTH")]
    public string WIDTH { get; set; }
}

[XmlRoot(ElementName = "FIELDS")]
public class FIELDS
{
    [XmlElement(ElementName = "FIELD")]
    public List<FIELD> FIELD { get; set; }
}

[XmlRoot(ElementName = "METADATA")]
public class METADATA
{
    [XmlElement(ElementName = "FIELDS")]
    public FIELDS FIELDS { get; set; }
    [XmlElement(ElementName = "PARAMS")]
    public string PARAMS { get; set; }
}

[XmlRoot(ElementName = "ROW")]
public class ROW
{
    [XmlAttribute(AttributeName = "ID")]
    public string ID { get; set; }
    [XmlAttribute(AttributeName = "NAME")]
    public string NAME { get; set; }
}

[XmlRoot(ElementName = "ROWDATA")]
public class ROWDATA
{
    [XmlElement(ElementName = "ROW")]
    public List<ROW> ROW { get; set; }
}
//create xml logic
var dataPacket = new DATAPACKET();
var metaData = new METADATA();

var fields = new List<FIELD>();
fields.Add(new FIELD() { WIDTH = "8", Fieldtype = "string", Attrname = "ID" });
fields.Add(new FIELD() { WIDTH = "30", Fieldtype = "string", Attrname = "NAME" });
var rows = new List<ROW>();
rows.Add(new ROW() { ID = "00000000", NAME = "Peter" });
rows.Add(new ROW() { ID = "00000010", NAME = "Lucie" });
metaData.FIELDS = new FIELDS() { FIELD = fields };

var rowData = new ROWDATA();
rowData.ROW = rows;

dataPacket.METADATA = metaData;
dataPacket.ROWDATA = rowData;
var writer =  new XmlSerializer(typeof(DATAPACKET));
var file = File.Create(xmlfilepath);
writer.Serialize(file, dataPacket);
file.Close();

//read xml logic
using (StreamReader r = new StreamReader(xmlfilepath))
{
    string xmlString = r.ReadToEnd();

    XmlSerializer ser = new XmlSerializer(typeof(DATAPACKET));

    using (TextReader reader = new StringReader(xmlString))
    {
        var marketingAllCardholder = (DATAPACKET)ser.Deserialize(reader);

        //add your logic here
    }
}