0

我有一个来自 XmlSchemaSetProvider 的 XML 模式,并且需要所有可能的 XML 元素(名称)的列表,这些元素(名称)可能以正确的顺序处于给定类型中。

架构使用 XML 架构扩展、复杂类型、序列...

有什么好方法可以做到这一点吗?

原因:我有一个自定义 XML 序列化程序,它依赖于在反映 .NET 类型时返回的属性顺序,但是(记录为未定义的)顺序行为随着 MSBuild 14 的变化而改变。现在我必须更正顺序,而不需要将大约 1000 XmlElement.Order 放在所有类属性。所以想法是从 XSD 信息中检测/更正顺序并使用它来修复 XML。

4

2 回答 2

0

最后,我选择了基于类布局而不是 XML Schema 的不同方法。我通过一次搜索和替换在所有属性上添加了一个“[PropertyLineNumber]”,并通过反射使用它来获得可靠的订单。顺序按“继承链然后行号”。这里是我用来通过反射为我们的序列化程序提供行号信息的属性(使用 C# 6)。

[AttributeUsage(AttributeTargets.Property)]
public sealed class PropertyLineNumberAttribute : Attribute
{
    public int LineNumber { get; }

    public PropertyLineNumberAttribute([CallerLineNumber] int lineNumber = 0)
    {
        LineNumber = lineNumber;
    }
}
于 2015-12-17T17:34:28.447 回答
0

在一般情况下,您所要求的是不可能的。如果该类型可以包含 N 个不同的元素,则可以设计一个模式,其中元素的某些子集可以根据上下文以不同的顺序出现。因此,对于模式中的所有元素,不存在单一定义的序列。您想到的特定模式可能不会遇到这个问题(尽管您应该假设最坏的情况,直到您可以证明它们没有)。如果您认为可以为这组受限的模式提供解决方案,那么您将需要设计一个自定义解决方案,我建议您设计得相当保守。特别是,您应该包含断言,以检查是否存在破坏您的唯一可能序列规则的场景。

说了这么多,我很想了解您的请求背后的业务需求。可以通过其他一些(更简单的)方法来解决这个问题。

于 2015-12-17T11:57:02.880 回答