为分层数据创建XSD

时间:2012-02-28 08:50:21

标签: c# .net xml xsd

我想将对象导出为XML并创建XSD。以下是基类

class Owner
{
    private int id;
    private string name;
    private List<Car> cars;
    private int age;
}

class CarTemplate
{
    private int drive;
    private double engineCc;
}

class Car
{
    private int id;
    private string name;
    private double cost;
    private CarTemplate template;
}

以下是我想要导出到XML并从中创建XSD的修改过的结构

class ExportedOwner
{
    private int id;
    private string name;
    private List<Car> cars;
}

class ExportedCar
{
    private string name;
    private double cost;
    private CarTemplate template;
}

XML的结构应采用以下格式

<?xml version="1.0" encoding="utf-8" ?>
<Owner>
    <id>1</id>
    <Name>John</Name>
    <Age>49</Age>
    <Cars>
        <Car>
            <id>1</id>
            <Name>Merc Class C</Name>
            <CarTemplate>
                <drive>2</drive>
                <engineCc>2500</engineCc>
            </CarTemplate>
        </Car>
        <Car>
            <id>2</id>
            <Name>Merc Class M</Name>
            <CarTemplate>
                <drive>4</drive>
                <engineCc>2900</engineCc>
            </CarTemplate>
        </Car>
    </Cars>
</Owner>

如何为XML格式创建XSD。我希望XSD将XML文件导回到应用程序中。

4 个答案:

答案 0 :(得分:1)

使用XSD.EXE生成XSD:它是标准的.NET Framework工具。请参阅http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx以查看其使用方式。

答案 1 :(得分:0)

如果要动态地从类中生成XML,可以使用System.Reflection

例如:

Type type = typeof(ExportedOwner);

var propertyinfos = type.GetProperties(); // gives you a list of all properties of ExportedOwner

然后根据您的规范使用您最喜欢的XMl Writer生成XML。

答案 2 :(得分:0)

您可以使用标准XML序列化程序(使用xsd.exe)。您需要在基类上使用KnownTypeAttribute,以便反序列化知道如何为结构重新水化。

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute.aspx

答案 3 :(得分:0)

这里有2个不同的问题要回答......

首先,如何将对象导出到XML文件。在.NET中有很多方法可以做到这一点。最常见的两个(XmlSerializer和DataContractSerializer)在此blog post中并排比较。

你问题的第二部分有点宽泛。从现有XML文件生成xsd模式并不是一门精确的科学,但是有一些工具可以从XML文件推断(或猜测)模式。有各种各样的小工具可以为你做到这一点 - 可能值得尝试其中一些,看看哪一个给你最好的结果。与往常一样,google is your good friend:)