2015-12-17 30 views
0

我有一个来自XmlSchemaSetProvider的XML模式,并且需要列表全部可能的XML元素(名称)可能在给定类型按正确的顺序。如何从.NET中的XmlSchemaObject按顺序获取可能的XML元素的平面列表

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

有没有做到这一点的一些好办法吗?

原因: 我有一个自定义XML序列化程序,它依赖于反映.NET类型时返回的属性顺序,但是(记录为未定义的)顺序行为随MSBuild 14更改。现在,我必须更正订单,所有类属性上的XmlElement.Order。所以我们的想法是检测/纠正XSD信息的顺序并使用它来修复XML。

+0

听起来好像你正在与类似的问题摔跤:http://stackoverflow.com/questions/1018490/net-serialization-ordering – kimbert

回答

0

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

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

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; 
    } 
} 
相关问题