2013-03-25 5 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 тип и разбор вручную.

Смежные вопросы