2015-12-17 42 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; 
    } 
} 
相關問題