簡體   English   中英

如何從.NET中的XmlSchemaObject按順序獲取可能的XML元素的平面列表

[英]How to get a flat list of possible XML Elements in order from a XmlSchemaObject in .NET

我有一個來自XmlSchemaSetProvider的XML Schema,並且需要以正確的順序列出給定類型的所有可能的XML元素(名稱)的列表。

模式使用XML模式擴展,復雜類型,序列...

有一些好的方法可以做到這一點嗎?

原因:我有一個自定義XML序列化程序,該序列化程序依賴於反映.NET類型時返回的屬性順序,但是該順序行為(記錄為未定義)已隨MSBuild 14更改。現在,我必須更正順序,而不必在所有位置上放置1000 XmlElement.Order類屬性。 因此,其想法是從XSD信息中檢測/更正順序,並使用它來修復XML。

在一般情況下,您所要求的是不可能的。 如果類型可以包含N個不同的元素,則可以設計一個架構,其中元素的某些子集可以根據上下文以不同的順序出現。 因此,對於架構中的所有元素都沒有一個定義好的序列。 您所想到的特定架構可能不會遭受此問題的影響(盡管您應該假設最壞的架構,直到可以證明它們沒有)。 如果您認為可以為這種受限的模式集提供解決方案,那么您將需要設計一個自定義解決方案,我建議您謹慎設計。 特別是,您應包括斷言,以檢查是否違反了唯一可能的規則。

綜上所述,我很想了解您的請求背后的業務需求。 可能可以通過其他(更簡單)的方法解決此問題。

最后,我選擇了一種基於類布局而不是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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM