如何以编程方式从类型生成xml架构?

Zac*_*tes 12 .net c# xml

我正在尝试以编程方式从任何.net类型生成xs:schema.我知道我可以使用反射并通过迭代公共属性来生成它,但是有内置的方法吗?

例:

[Serializable]
public class Person
{
    [XmlElement(IsNullable = false)] public string FirstName { get; set; }
    [XmlElement(IsNullable = false)] public string LastName { get; set; }
    [XmlElement(IsNullable = true)] public string PhoneNo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

期望的输出:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Person" type="Person" />
  <xs:complexType name="Person">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="FirstName" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="LastName" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="PhoneNo" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

Tys*_*son 13

我发现,根据我的一些属性,接受的答案生成了错误的模式.例如,它忽略了标有的枚举值的自定义名称[XmlEnum(Name="Foo")]

我相信这是正确的方法(鉴于你的使用XmlSerializer),也很简单:

var schemas = new XmlSchemas();
var exporter = new XmlSchemaExporter(schemas);
var mapping = new XmlReflectionImporter().ImportTypeMapping(typeof(Person));
exporter.ExportTypeMapping(mapping);
var schemaWriter = new StringWriter();
foreach (XmlSchema schema in schemas)
{
    schema.Write(schemaWriter);
}
return schemaWriter.ToString();
Run Code Online (Sandbox Code Playgroud)

代码摘自:http: //blogs.msdn.com/b/youssefm/archive/2010/05/13/using-xml-schema-import-and-export-for-xmlserializer.aspx


Zac*_*tes 9

所以这很有效,我想它并不像看起来那么难看:

var soapReflectionImporter = new SoapReflectionImporter();
var xmlTypeMapping = soapReflectionImporter.ImportTypeMapping(typeof(Person));
var xmlSchemas = new XmlSchemas();
var xmlSchema = new XmlSchema();
xmlSchemas.Add(xmlSchema);
var xmlSchemaExporter = new XmlSchemaExporter(xmlSchemas);
xmlSchemaExporter.ExportTypeMapping(xmlTypeMapping);
Run Code Online (Sandbox Code Playgroud)

我仍然希望那里有一个2线解决方案,似乎应该有,感谢提示@dtb


编辑 只是为了踢,这是2行版本(自我贬低幽默)

var typeMapping = new SoapReflectionImporter().ImportTypeMapping(typeof(Person));
new XmlSchemaExporter(new XmlSchemas { new XmlSchema() }).ExportTypeMapping(typeMapping);
Run Code Online (Sandbox Code Playgroud)


dtb*_*dtb 6

您可以以编程方式调用xsd.exe:

  1. xsd.exe添加为程序集引用.
  2. using XsdTool;
  3. Xsd.Main(new[] { "myassembly.dll", "/type:MyNamespace.MyClass" });

您还可以使用Reflector查看XsdTool.Xsd.ExportSchemas方法.它使用公共 XmlReflectionImporter, XmlSchemas,XmlSchema XmlSchemaExporterXmlTypeMapping类从.NET类型创建模式.

基本上它是这样做的:

var importer = new XmlReflectionImporter();
var schemas = new XmlSchemas();
var exporter = new XmlSchemaExporter(schemas);

var xmlTypeMapping = importer.ImportTypeMapping(typeof(Person));
exporter.ExportTypeMapping(xmlTypeMapping);

schemas.Compile(..., false);

for (var i = 0; i < schemas.Count; i++)
{
    var schema = schemas[i];
    schema.Write(...);
}                 ?
Run Code Online (Sandbox Code Playgroud)

您应该能够通过将合适的编写器传递给XmlSchema.Write方法来自定义输出.