【问题标题】:How to generate XML Schema from C# type with XSD.exe such that [XmlAttribute] property is mapped to required XML attribute?如何使用 XSD.exe 从 C# 类型生成 XML 架构,以便将 [XmlAttribute] 属性映射到所需的 XML 属性?
【发布时间】:2014-01-06 19:51:45
【问题描述】:

简单地说,当我使用 XSD.exe(Visual Studio 2012 附带的)从这个类生成 XML 模式文件时:

[Serializable]
public class Person
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlAttribute]
    public int Age { get; set; }
}

结果如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Person" nillable="true" type="Person" />
  <xs:complexType name="Person">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="Age" type="xs:int" use="required" />
  </xs:complexType>
</xs:schema>

注意 Age 属性在生成的架构中被指定为必需(它具有 use="required"),而属性 Name 不是。

我像这样使用 XSD.exe:

xsd.exe Sample.exe /type:Person

Sample.exe 是定义 Person 类的 .NET 程序集。

我想以某种方式在我的类中指定哪些 XmlAttribute 属性是必需的,哪些不是,以便 XSD.exe 可以从中自动生成架构。这可能吗?

【问题讨论】:

  • FWIW,XSD.EXE 不是一个好工具。微软几年前就停止了它的工作,我仍然发现它偶尔会出现错误。
  • 您能推荐一个替代工具吗?每当我在 C# 代码中更改我的 XML-serializable 类时,我想自动生成 XSD 文件(在项目构建后事件中)。
  • XmlSpy 很不错。如果你想要一个免费的工具,你可以试试这个:codeproject.com/Articles/133570/…
  • 感谢您的建议。实际上,我需要从 C# 代码(或更一般地说,从 .NET 类型/类)生成 XSD 文件。使用指定的工具可以做到这一点吗?
  • 我刚刚检查过,文章是关于从 XML 而非 C# 类生成 XSD。这并不能解决我的问题,但感谢您的努力,我很感激。

标签: c# xml xsd xml-serialization


【解决方案1】:

除非 XSD 中存在错误(不清楚您是否尝试过 XSD.exe 文档中描述的内容,特别是 attribute element binding support - 现在我无法测试它),答案是肯定的,您可以。

在您的情况下,Name 和 Age 之间的不同行为仅仅是因为 String 字段可以为空,而 int 则不是(不知何故,我不相信 int? 会对您的情况下,您仍然可以尝试...)属性不是可空的(从 XSD 的角度来看),因此使用 optional。

使用属性:从类生成 XML Schema 文档

以下两种情况,Xsd.exe都没有指定使用 属性,恢复为默认值可选:

• 存在遵循指定命名约定的额外公共 bool 字段。

• 通过类型属性为成员分配默认值 System.Component.DefaultValueAttribute。

如果这两个条件都不满足,Xsd.exe 会为 use 属性生成 required 值。

【讨论】:

  • 我实际上需要更多的是使“名称”(上述类中的字符串属性)成为 XML 文件中元素的必需属性。您在答案中专注于整数并将其设为可选,这很好。但是,我不确定如何使映射到 XSD 文件的类的字符串属性在 xsd.exe 生成的架构中具有 use="required" 。有什么想法吗?
  • 如果您浏览提供的链接,您可能会注意到 XmlAttributeAttribute 对引用类型的工作方式(字符串是其中之一)。结论是,对于引用类型,没有办法强制使用 use=required(至少我可以推断或知道)。换句话说,没有办法在 XSD 和 XSD.exe 为引用类型(XSD 到代码,代码到 XSD)生成的代码之间正确往返。
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 2023-04-07
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2017-11-02
  • 2018-03-24
相关资源
最近更新 更多