我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 C# 代码)?
简短的回答是否定的。在这个特定的实例中,这似乎是 XSD.exe 的一个错误,但即便如此,它通常对复杂类型的支持仍然很差,因为它生成的代码很大程度上是面向序列化/反序列化的,而不是面向模式的,因此它只付出了最小的努力来建模模式语义。
我建议使用另一个名为 'dotnet-xscgen' 的工具,来自 https://github.com/mganss/XmlSchemaClassGenerator(查看有关如何安装/使用它的说明此处)
它生成的代码仍然与 XSD.exe 非常相似(即
XmlSerializer
兼容),但有很大改进。运行原始架构(没有虚拟元素)时,它会生成以下代码(为了简洁起见,我删除了所有属性):
// This code was generated by XmlSchemaClassGenerator version 2.1.1057.0 using the following command:
// xscgen schema.xsd --namespace=Default
public partial class ContainingClass
{
private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArrayContainer;
public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArrayContainer {
get {
return _outerArrayContainer;
}
private set {
_outerArrayContainer = value;
}
}
/// <summary>
/// <para xml:lang="en">Initializes a new instance of the <see cref="ContainingClass" /> class.</para>
/// </summary>
public ContainingClass() {
this._outerArrayContainer = new System.Collections.ObjectModel.Collection<InnerArrayContainer>();
}
}
public partial class OuterArrayContainer
{
private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArray;
public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArray {
get {
return _outerArray;
}
private set {
_outerArray = value;
}
}
/// <summary>
/// <para xml:lang="en">Initializes a new instance of the <see cref="OuterArrayContainer" /> class.</para>
/// </summary>
public OuterArrayContainer() {
this._outerArray = new System.Collections.ObjectModel.Collection<InnerArrayContainer>();
}
}
public partial class InnerArrayContainer
{
private System.Collections.ObjectModel.Collection<int> _innerArray;
public System.Collections.ObjectModel.Collection<int> InnerArray {
get {
return _innerArray;
}
private set {
_innerArray = value;
}
}
/// <summary>
/// <para xml:lang="en">Initializes a new instance of the <see cref="InnerArrayContainer" /> class.</para>
/// </summary>
public InnerArrayContainer() {
this._innerArray = new System.Collections.ObjectModel.Collection<int>();
}
}
微软似乎对改进 XML 工具不感兴趣,因此其他人已经填补了这个空缺。