2013-03-25 53 views
3

我想將C#類結構序列化爲XML,並提供特定的節點名稱,而不必擁有一堆嵌套類。這有可能使用屬性?是否可以使用屬性指定XML節點名稱和深度

例如說我有以下XML:

<OuterItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <InnerItem> 
     <ItemValue>something i need</ItemValue> 
    </InnerItem> 
</OuterItem> 

我有一個XML序列化方法,看起來像這樣:

public static string XmlSerializeToString<T>(T value) 
{ 
    if (value == null) { return null; } 

    XmlSerializer serializer = new XmlSerializer(typeof(T)); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = false; 
    settings.OmitXmlDeclaration = true; 

    using (StringWriter textWriter = new StringWriter()) 
    using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) 
    { 
     serializer.Serialize(xmlWriter, value); 
     return textWriter.ToString(); 
    } 
} 

我就必須有一個C#類結構是怎樣的呢?

public class OuterItem 
{ 
    public InnerItem InnerItem { get; set; } 
} 

public class InnerItem 
{ 
    public string ItemValue { get; set; } 
} 

或者是它在所有可能的聲明我的節點應該怎麼遠了XML文檔中像這樣的東西(僞代碼):

public class OuterItem 
{ 
    [XmlNode("InnerItem\ItemValue")] 
    public string ItemValue { get; set; } 
} 

回答

0

不,這是不可能的使用Xpath或XmlNode屬性中的類似表達式。您對control xml serialization的屬性選擇非常有限。

您可以使用下面的黑客攻擊,反序列化XML您有:

public class OuterItem 
{ 
    [XmlArrayItem(ElementName="ItemValue", Type=typeof(string))] 
    [XmlArray] 
    public string[] InnerItem 
    { 
     get; set; 
    } 
} 

public class Test 
{ 
    static void Main() 
    { 
     var item = new OuterItem { InnerItem = new[]{"AAA"} }; 
     XmlSerializer ser = new XmlSerializer(typeof(OuterItem)); 
     ser.Serialize(Console.Out,item); 
    } 
} 

這將產生以下XML:

<?xml version="1.0" encoding="utf-8"?> 
<OuterItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <InnerItem> 
    <ItemValue>AAA</ItemValue> 
    </InnerItem> 
</OuterItem> 

另一種可能的解決方案是使用XmlTextAttribute,得到內部XML爲XmlNode的財產鍵入並手動解析。

相關問題