2017-07-11 122 views
0

我使用的工具Xsd2Code使用xml模式定義文件生成包含多個部分類的DespatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相關數據並將輸出序列化爲xml。是否可以在另一個類中裝飾公共屬性?

然而情況往往如此,並不是所有的都是我想要的。我不需要一些最終序列化的元素,而不填充數據只是簡單地將它們序列化爲空元素。由此產生的xml必須符合我們客戶設定的嚴格標準,這些空白元素「打破」了這些標準。

我有幾個選擇來解決這個問題。我可以從原始的xsd模式文件中刪除這些元素,但它們是由GS1標準組織生成的,任何更新都會破壞我自己的自定義設置,或者至少要求我重新應用它們。

或者我可以修改由Xsd2Code生成的.cs文件,刪除那些不需要的屬性。但是,與上面類似的情況下,任何.cs的再生都會破壞我的修改。

我現在採用的方法是對後者進行修改,用.XmlIgnoreAttribute()修飾.cs文件中不需要的屬性。在下面的代碼片段Manifest已由該工具生成,但不能在生成的xml中序列化。除XmlIgnoreAttribute行外,所有代碼都是自動生成的。

[System.Xml.Serialization.XmlElementAttribute(Order = 3)] 
    public DocumentIdentification DocumentIdentification 
    { 
     get 
     { 
      return this.documentIdentificationField; 
     } 
     set 
     { 
      this.documentIdentificationField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlIgnoreAttribute()]  // Exclude Manifest 
    [System.Xml.Serialization.XmlElementAttribute(Order = 4)] 
    public Manifest Manifest 
    { 
     get 
     { 
      return this.manifestField; 
     } 
     set 
     { 
      this.manifestField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlArrayAttribute(Order = 5)] 
    [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)] 
    public List<Scope> BusinessScope 
    { 
     get 
     { 
      return this.businessScopeField; 
     } 
     set 
     { 
      this.businessScopeField = value; 
     } 
    } 

因此,我的問題的關鍵。有沒有一種方法可以應用XmlIgnoreAttribute而不修改生成的DespatchAdvice.designer.cs文件(並且不必在重載中重新編碼整個Manifest塊)?

編輯:

這些是我在生成.cs文件時使用的選項。突出顯示從默認值更改的值。

Xsd2Code options selected

+0

其他類聲明爲「partial」嗎? –

+0

Romano,不確定你指的是哪一個「其他」類。生成的.cs包含多個部分類。儘管唯一其他的真正的類是我的程序類(這不是部分的,但會有幫助嗎?),但我還有其他所有的東西都可以免費統治。對不起,部分類對我來說有些未知。 –

+1

你能提供一個證明這一點的[mcve]嗎?因爲(通常)將屬性設置爲null會阻止它被序列化 - 參見[this fiddle](https://dotnetfiddle.net/jKW2L6)。也就是說,你所要求的可以用['XmlAttributeOverrides'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides(v = vs.110))完成。 ASPX)。 –

回答

0

Xsd2Code有一個選項來初始化所有領域,所以我懷疑這裏所發生的是一個「默認」 Manifest創建,這就是你眼看時序列化對象圖。

XmlSerializer行爲是省略那些null除非XmlElement屬性具有IsNullable property集到true元件。在這種情況下,它會使用xsi:nil="true"屬性序列化一個空元素。

因此,我不建議添加或覆蓋屬性(您可以使用XmlAttributeOverrides來實現),而是建議您將要忽略的元素設置爲null

+0

我編輯了我原來的帖子,以包含我使用的Xsd2Code選項。你能否指出你指的是哪個選項,將「初始化所有領域」 - 他們都沒有看到具體的描述。 –

+0

@WayneIvory我的猜測是'EnableInitializeFields = True'(截圖中的第二個屬性)。我認爲這會導致'Manifest = new Manifest();'在構造函數中生成。這通常很有用,因爲您可以設置屬性而不用擔心空引用。 –

相關問題