C#.Net-使用现有结构/模式以xml编写数据

C#.Net-使用现有结构/模式以xml编写数据,c#,.net,xml,C#,.net,Xml,我有一个API,它基于模式文件创建一个示例xml。以下是API的链接: 现在,假设生成的示例xml如下所示: <Employee> <Name>Bond</Name> <Address>abc,unknown street</Address> <phone>0000000000</phone> <Employee> 债券 abc,无名街 0000000000 我有一个emplo

我有一个API,它基于模式文件创建一个示例xml。以下是API的链接:

现在,假设生成的示例xml如下所示:

<Employee>
   <Name>Bond</Name>
   <Address>abc,unknown street</Address>
   <phone>0000000000</phone>
<Employee>

债券
abc,无名街
0000000000
我有一个employee DB表,由数千条员工记录组成。我想要的是以上面创建的xml格式编写这些记录(表中也有许多非必需的列,因此无法使用
dataset.writexml


这样做的正确方法是什么?我是否应该根据第一条记录编辑第一个节点,然后将整个节点复制到同一个xml中,写入记录,然后重复该过程直到记录结束?或者有更好的方法吗?

一种方法可以是使用
xsd.exe
(VS命令行工具之一)从示例XML生成架构,然后使用
xsd.exe
和架构生成C#类。该类已准备好用于序列化,因此您可以将数据转换为
列表
,然后执行以下操作。不是说这是最好的方法,但我以前成功地使用过它。

一种方法可以是使用
xsd.exe
(VS命令行工具之一)从示例XML生成模式,然后使用
xsd.exe
与模式一起生成C#类。该类已准备好用于序列化,因此您可以将数据转换为
列表
,然后执行以下操作。并不是说这是最好的方法,但我以前成功地使用过它。

这里是一个将对象序列化和反序列化为xml的示例

using System;
using System.Xml.Serialization;
using System.IO;

namespace Test
{
[Serializable]
[XmlRoot("DocumentElement")]
public class Documentelement
{
    [XmlElement]
    public PartInfo[] PartInfo { get; set; }
}

public class PartInfo
{
    [XmlElement]
    public int ID { get; set; }
    public string Name { get; set; }
    public string PartNo { get; set; }
    public int SerialNo { get; set; }
    public string Parameter { get; set; }        
    public DateTime InstallDate { get; set; }
    public DateTime InstallTill { get; set; }
}

public class Test
{

    private PartInfo details_1()
    {
        PartInfo details = new PartInfo
        {
            ID = 0,
            Name = "QVR",
            PartNo = "A11",
            SerialNo = 453,
            Parameter = "C -11",

            // This you should add as date time,  I just used the string to parse your time that you showed in your example.
            InstallDate = DateTime.Parse("2013-02-04T17:16:56.383+05:30"),
            InstallTill = DateTime.Parse("2013-02-15T17:16:56.3830837+05:30")
        };
        return details;
    }

    private PartInfo details_2()
    {
        PartInfo details = new PartInfo
        {
            ID = 1,
            Name = "EAFR",
            PartNo = "B07",
            SerialNo = 32,
            Parameter = "B-16",

            // This you should add as date time,  I just used the string to parse your time that you showed in your example.
            InstallDate = DateTime.Parse("2013-02-18T17:17:44.589+05:30"),
            InstallTill = DateTime.Parse("2013-02-28T17:17:44.589+05:30")
        };
        return details;
    }

    public void setXmlValues()
    {            
        Documentelement testOut = new Documentelement { PartInfo = new[] { details_1(), details_2() }};

        xml_serialise(testOut);

        Documentelement testIn = xml_deserialise();
        int val = testIn.PartInfo[0].ID;
        DateTime dt = testIn.PartInfo[0].InstallDate;
        string shortTime = dt.ToShortTimeString();

    }


    private void xml_serialise(Documentelement test)
    {
        XmlSerializer ser = new XmlSerializer(typeof(Documentelement));


        using (TextWriter writer = new StreamWriter("test.xml"))
        {
            ser.Serialize(writer, test);
        }
    }

    private Documentelement xml_deserialise()
    {
        XmlSerializer ser = new XmlSerializer(typeof(Documentelement));

        Documentelement test;

        using (TextReader writer = new StreamReader("test.xml"))
        {
            test = (Documentelement)ser.Deserialize(writer);
        }

        return test;
    }
}
}

下面是一个将对象序列化和反序列化为xml的示例

using System;
using System.Xml.Serialization;
using System.IO;

namespace Test
{
[Serializable]
[XmlRoot("DocumentElement")]
public class Documentelement
{
    [XmlElement]
    public PartInfo[] PartInfo { get; set; }
}

public class PartInfo
{
    [XmlElement]
    public int ID { get; set; }
    public string Name { get; set; }
    public string PartNo { get; set; }
    public int SerialNo { get; set; }
    public string Parameter { get; set; }        
    public DateTime InstallDate { get; set; }
    public DateTime InstallTill { get; set; }
}

public class Test
{

    private PartInfo details_1()
    {
        PartInfo details = new PartInfo
        {
            ID = 0,
            Name = "QVR",
            PartNo = "A11",
            SerialNo = 453,
            Parameter = "C -11",

            // This you should add as date time,  I just used the string to parse your time that you showed in your example.
            InstallDate = DateTime.Parse("2013-02-04T17:16:56.383+05:30"),
            InstallTill = DateTime.Parse("2013-02-15T17:16:56.3830837+05:30")
        };
        return details;
    }

    private PartInfo details_2()
    {
        PartInfo details = new PartInfo
        {
            ID = 1,
            Name = "EAFR",
            PartNo = "B07",
            SerialNo = 32,
            Parameter = "B-16",

            // This you should add as date time,  I just used the string to parse your time that you showed in your example.
            InstallDate = DateTime.Parse("2013-02-18T17:17:44.589+05:30"),
            InstallTill = DateTime.Parse("2013-02-28T17:17:44.589+05:30")
        };
        return details;
    }

    public void setXmlValues()
    {            
        Documentelement testOut = new Documentelement { PartInfo = new[] { details_1(), details_2() }};

        xml_serialise(testOut);

        Documentelement testIn = xml_deserialise();
        int val = testIn.PartInfo[0].ID;
        DateTime dt = testIn.PartInfo[0].InstallDate;
        string shortTime = dt.ToShortTimeString();

    }


    private void xml_serialise(Documentelement test)
    {
        XmlSerializer ser = new XmlSerializer(typeof(Documentelement));


        using (TextWriter writer = new StreamWriter("test.xml"))
        {
            ser.Serialize(writer, test);
        }
    }

    private Documentelement xml_deserialise()
    {
        XmlSerializer ser = new XmlSerializer(typeof(Documentelement));

        Documentelement test;

        using (TextReader writer = new StreamReader("test.xml"))
        {
            test = (Documentelement)ser.Deserialize(writer);
        }

        return test;
    }
}
}

你试过什么吗?您需要显示您尝试过的代码,并指定一个更具体的问题。如果您创建了一个与数据模型匹配的对象,例如employee类包含所有作为属性的员工详细信息,并且它实现了IEnumerable,那么您可以将该类序列化/反序列化为xml。@Jegan不能这样做。因为我不知道这个类的属性是什么。字段在运行时由xsd文件确定。然后使用字典或元组在运行时获取字段和值,将其解析为序列化程序。您尝试过什么吗?您需要显示您尝试过的代码,并指定一个更具体的问题。如果您创建了一个与数据模型匹配的对象,例如employee类包含所有作为属性的员工详细信息,并且它实现了IEnumerable,那么您可以将该类序列化/反序列化为xml。@Jegan不能这样做。因为我不知道这个类的属性是什么。字段在运行时由xsd文件确定。然后使用字典或元组在运行时获取字段和值,将其解析为序列化程序。我最初考虑过这种方法。但是xsd是在运行时提供给程序的。因此,这种方法需要在运行时调用xsd.exe,动态编译类,然后使用反射将其序列化为xml。我想这有点乏味,而且容易出错。我一开始就想到了这种方法。但是xsd是在运行时提供给程序的。因此,这种方法需要在运行时调用xsd.exe,动态编译类,然后使用反射将其序列化为xml。我想这有点乏味而且容易出错。