如何从.NET中的XmlSchemaObject中按顺序获取可能的XML元素的平面列表



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

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

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

原因:我有一个自定义XML序列化程序,它依赖于在反射.NET类型时返回的属性顺序,但该(记录为未定义的)顺序行为在MSBuild 14中发生了更改。现在,我必须更正顺序,而不在所有类属性上放置大约1000个XmlElement.order。因此,我们的想法是从XSD信息中检测/更正顺序,并使用它来修复XML。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新