XSD.exe缺少嵌套属性

时间:2012-04-11 16:04:20

标签: c# xslt xsd

我在这里有一个扁平的XSD: http://pastebin.com/tQVSH9Jp

我有一个'替换'XSLT脚本我正在运行它以修复XSD.exe(忽略引用的元素),但是生成的XSD缺少一些属性。 ID)中不存在{UniqueID_Type

任何人都可以提供能够正确执行这些替换的XSLT脚本,甚至可以提供另一种解决方案吗?

1 个答案:

答案 0 :(得分:3)

有人建议编写自己的xsd.exe,并依赖于XmlSchemaImporter,这很有趣......首先,我不认为这是一项微不足道的任务;其次,缺少属性的问题来自XmlSchemaImporter; ImportAttributeGroupMembers中存在一个错误:它不是在寻找XmlSchemaAttributeGroupRef,而是在检查XmlSchemaAttributeGroup(摘要见下面的Reflector):

private void ImportAttributeGroupMembers(XmlSchemaAttributeGroup group, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, string ns)
{
    for (int i = 0; i < group.Attributes.Count; i++)
    {
        object obj2 = group.Attributes[i];
        if (obj2 is XmlSchemaAttributeGroup)
        {
            ...
        }
        else if (obj2 is XmlSchemaAttribute)
        {
           ...
        }
     }
     ...
}

有一个类似的实用程序xsd2code,在进入XML Schema Refactoring(XSR)之前,我会尝试使用原始的XSD。

如果你想沿着这条路走下去,我推荐QTAssistant用于XSR(我与之相关)。我已经尝试了最新版本(4.0.21)的XSD,但它确实有效。我发布了结果here

使用XSD.exe为您指出为有缺陷的片段生成的代码(我只显示字段)现在显示ID属性的idField:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.opentravel.org/OTA/2003/05")]
public partial class UniqueID_Type {

    private CompanyNameType companyNameField;

    private string uRLField;

    private string typeField;

    private string instanceField;

    private string idField;

    private string iD_ContextField;

    ...
}

您的设置的具体内容是必须设置为true的InlineAttributeGroup:

QTAssistant setting InlineAttributeGroups

如果您对使用QTAssistant进行重构的更多详细信息感兴趣,请查看this post,同样关注SO。无论如何,我已经发布了整个重构的架构,随意使用它......