2010-03-19 17 views
5

considerar las siguientes clases serializables:.net serialización XML: cómo especificar nombres de elemento raíz y el elemento secundario de una matriz

class Item {...} 
class Items : List<Item> {...} 
class MyClass 
{ 
    public string Name {get;set;} 
    public Items MyItems {get;set;} 
} 

Quiero la salida en serie para que parezca:

<MyClass> 
    <Name>string</Name> 
    <ItemValues> 
     <ItemValue></ItemValue> 
     <ItemValue></ItemValue> 
     <ItemValue></ItemValue> 
    </ItemValues> 
</MyClass> 

Aviso del nombres de elemento ItemValues ​​y ItemValue no coinciden con los nombres de clase Item and Items, suponiendo que no puedo cambiar la clase Item o Items, ¿hay alguna razón para especificar los nombres de elementos que deseo, modificando la Clase MyClass?

+0

¿Qué tipo de serialización? 'XmlSerializer'? 'DataContractSerializer'? –

+0

@John - XmlSerializer – Jeremy

Respuesta

6
public class MyClass 
{ 
    public string Name {get;set;} 
    [XmlArray("ItemValues")] 
    [XmlArrayItem("ItemValue")] 
    public Items MyItems {get;set;} 
} 
1

Es posible que desee ver en "How to: Specify an Alternate Element Name for an XML Stream"

Ese artículo discute el uso de la XmlElementAttribute 's ElementName para lograr esto.

+0

No publique enlaces .NET 1.1. Alguien que haga clic en ese enlace y no lo note, luego hará clic en los enlaces en el documento, y será guiado a más y más información antigua. –

+0

En realidad, '[XmlElement]' no ayudará aquí; eso permitirá hacer ' cadena' (obsérvese que no hay '' ), pero no lo hace la pregunta. –

0

También podría considerar usar Linq en Xml para construir su XML de su clase. Algo así como

XElement element = new XElement(
    "MyClass", 
    new XElement("Name", myClass.Name), 
    new XElement(
     "ItemValues", 
     from item in myClass.Items 
     select new XElement(
      "ItemValue", 
      new XElement("Foo", item.Foo)))); 

que crearía

<MyClass> 
    <Name>Blah</Name> 
    <ItemValues> 
    <ItemValue> 
     <Foo>A</Foo> 
    </ItemValue> 
    <ItemValue> 
     <Foo>B</Foo> 
    </ItemValue> 
    </ItemValues> 
</MyClass> 
Cuestiones relacionadas