2013-11-28 36 views
7

我的第一個問題在SO:,)和它的約爲XmlSerializer和命名空間問題。XmlSerializer +抽象類+派生類=無用命名空間

我知道已經有很多關於如何從Xml文件的根元素中刪除默認Xml名稱空間的主題,它不是主題。

我的問題是當你使用派生類時如何從子節點中刪除它?

我已經創建了自己的序列化程序,它可以接受自定義命名空間或簡單地忽略它們,它對於根元素來說工作得很好。

但是,當我使用抽象類列出列表中的某些派生類時,序列化插入2屬性位於每個派生類的節點中。

像這樣:

<root> 
    <elements> 
    <element p3:type="XmlDerivedClass" xmlns:p3="{schema_url}" > 
    </element> 
    </elements> 
</root> 

至於我的課:

// Root element 
[XmlRoot("root", Namespace="")] 
public class XmlRootElement 
{ 
    List<XmlBaseClass> _Elements; 
}  

// Base class 
[XmlInclude(typeof(XmlDerivedClass))] // Mandatory, prevents serialization errors 
[XmlRoot(Namespace="")] 
public abstract class XmlBaseClass 

// Derived class 
[XmlRoot("element", Namespace="")] 
public class XmlDerivedClass : XmlBaseClass 

我嘗試了一些常見的解決方案:

  • 使用命名空間= 「」 屬性
  • 實施XmlNamespaceDeclarations財產(用正確的空命名空間)
  • 從基地CLASE移動XmlRoot()派生一個
  • 更改XmlRoot()的XmlElement()

我會盡力在列表上添加XmlInclude標記以查看它是否改變了某些內容。

到目前爲止,沒有什麼工作,以消除那些該死的命名空間......

如果任何人有一個解決方案,我會很高興來試試吧。

[編輯21/02/2014] 好吧,似乎我是唯一一個面臨這個問題。我將使用一個簡單的字符串。替換刪除無用的XML,但這很髒。


PS:對於背景下,標籤是不是在另一端解析器一個問題,但不是在需要的時候,所以我正在尋找一種方法,以消除它們。

PS2:對不起,任何拼寫錯誤,英文不是我的母語。

+0

我試着添加** [XmlArrayItem(「element」,Type = typeof(XmlDerivedClass))] **,但它解決了只有一個派生類的問題。 對於具有相同節點名稱的多個派生類,它不適用於此系統。 – Ethenyl

回答

0

如果添加[XmlType],你可以給串行有關類型的信息,如名稱空間是屬於:

// Base class 
[XmlInclude(typeof(XmlDerivedClass))] // Mandatory, prevents serialization errors 
[XmlType(Namespace="")] 
public abstract class XmlBaseClass 

// Derived class 
[XmlType("element", Namespace="")] 
public class XmlDerivedClass : XmlBaseClass 
+0

謝謝你,我會盡快嘗試。 – Ethenyl

+0

現在我得到一個有趣的結果''。我將嘗試使用** XmlTypeAttribute **來查看我是否可以更好地獲得某些內容。 – Ethenyl

2

我不知道這是否是滿足您的需求,因爲一個解決方案它不是很好,但它的工作原理並不太髒。

public abstract class Abs 
{ 
    public int Data { get; set; } 
} 


public class A : Abs{} 

public class B : Abs{} 

[Serializable] 
[XmlRoot(elementName: "name")] 
public class Ser 
{ 
    [XmlElement(elementName: "A")] 
    public List<A> AList { get; set; } 

    [XmlElement(elementName: "B")] 
    public List<B> BList { get; set; } 

    [XmlIgnore] 
    public List<Abs> AbsList { 
     get 
     { 
      var list = new List<Abs>(AList.ConvertAll(x=>(Abs)x)); 
      list.AddRange(BList.ConvertAll(x=>(Abs)x)); 
      return list; 
     } 
    } 
} 

相反XmlInclude,你可以創建一個派生類對象列表,之後的私有成員內把它們加起來也許緩存。 請再次注意,這仍然很不理想,但它適用於我,所以我想分享它。

+0

無論如何,如果您使用數組,您可以使用** XmlElement **和** XmlArrayItem **屬性爲您完成這項工作。 – user3194973