2011-01-23 79 views
10

我試圖去這個結果,而序列化XML序列化數組沒有根元素

<Test> 
    <Category> 
    <FileName>C:\test.txt</FileName> 
    <!-- Note that here this is an array of a simple class with two fields 
     without root --> 
    <Prop1>1</Prop1> 
    <Prop2>2</Prop2> 

    <Prop1>4</Prop1> 
    <Prop2>5</Prop2> 
    <!-- End array --> 
    </Category> 
</Test> 

我已經嘗試這樣

[Serializable] 
[XmlRoot("Test")] 
public class Test 
{ 
    [XmlElement("Category")] 
    public List<Category> Category= new List<Category>(); 
} 

[Serializable] 
[XmlRoot("Category")] 
public class Category 
{ 
    [XmlElement("FileName")] 
    public string FileName { get; set; } 

    [XmlElement("Property")] 
    public List<Property> Properties = new List<Property>(); 
} 

[Serializable] 
public class Property 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

不同的事情,但我仍然得到這樣的輸出:

<Test> 
    <Category> 
    <FileName>C:\test.txt</FileName> 
    <Property> 
     <Prop1>1</Prop1> 
     <Prop2>2</Prop2> 
    </Property> 
    <Property> 
     <Prop1>4</Prop1> 
     <Prop2>5</Prop2> 
    </Property> 
    </Category> 
</Test> 

如何刪除Property標籤? 非常感謝

+2

你正在努力實現的XML似乎很曖昧的給我。在相同級別有兩個具有相同名稱的子節點看起來不正確。 –

+0

首先感謝Yads您的回覆 我得到來自外部源的這個文件,我同意你的看法,這不是一個良好的XML文件,但你可以想像我們已經要求將故障源的編輯器來糾正他們的輸出... – Khoumbe

回答

2

不,如果不使事情變得複雜,這是不可能的。一種選擇是實施IXmlSerializable,即以獲得100%的權利。你可能也可以通過創建兩個子類型,使用基於類型的版本[XmlArrayItem],並將該模型分解成塊。坦率地說,我認爲這也不值得。

我個人的偏好是選擇不同的佈局,或者使用LINQ-to-XML。這對XmlSerializer來說不是一件好事。

+0

感謝馬克您的回覆我計劃實施IXmlSerializable的解決方案,但最終與XmlChoiceIdentifier解決方法行之有效再次 感謝您的回覆 – Khoumbe

+0

這是可能的,而且並不困難 - 見接受的答案爲http://stackoverflow.com/問題/ 2006482/C鋒利的XML序列化 - 禁用 - 渲染 - 根元素的數組 –

6

在情況下,如果你真的需要準確的輸出,如上述規定,你可以使用的解決方法是這樣的:

[Serializable] 
public partial class Test { 
    public List<Category> Category; 
} 

[Serializable] 
public partial class Category { 
    [XmlElement("FileName")] 
    public string FileName; 

    [XmlElement("Prop1")] 
    [XmlElement("Prop2")] 
    [XmlChoiceIdentifier("propName")] 
    public string[] Properties; 

    [XmlIgnore] 
    public PropName[] propName; 
} 

public enum PropName { 
    Prop1, 
    Prop2, 
} 
+0

安德烈 我要感謝你,你對這個解決辦法 我實現它,它並東西我knwo,這不是一個乾淨的解決方案,但我會使用時間Xml源編輯器正確噸繼承人輸出 Thansk再次1000次 – Khoumbe

相關問題