如何防止 XSD.EXE 在生成的 C# 中将嵌套类型折叠为交错数组?

问题描述 投票:0回答:1
c# xsd xsd.exe
1个回答
0
投票

我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 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 工具不感兴趣,因此其他人已经填补了这个空缺。

© www.soinside.com 2019 - 2024. All rights reserved.