2011-01-23 17 views
10

Estoy tratando de llegar a este resultado, mientras que la serialización XMLSerialize matriz sin elemento raíz

<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> 

ya probar cosas diferentes como esto

[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; } 
} 

Pero aún así obtener este resultado:

<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> 

¿Cómo puedo eliminar la etiqueta de propiedad? Muchas gracias por adelantado

+2

El XML su están tratando de lograr parece bastante ambigua para mí. Tener dos nodos secundarios con el mismo nombre en el mismo nivel no parece correcto. –

+0

Primero gracias Yads por su respuesta Obtengo este archivo de una fuente externa y estoy de acuerdo con usted en que no es un buen archivo xml, pero como se puede imaginar, ya le pedimos al editor de la fuente defectuosa que corrija su salida ... – Khoumbe

Respuesta

2

No, eso no es posible sin hacer las cosas complejas. Una opción es implementar IXmlSerializable, que es difícil para obtener el 100% a la derecha. Usted podría también hacerlo creando dos subtipos, usando las versiones basadas en tipo de [XmlArrayItem], y pirateando el modelo en pedazos. Francamente, tampoco creo que valga la pena.

Mi preferencia personal aquí sería elegir un diseño diferente o utilizar LINQ-to-XML. Esto no es bueno para XmlSerializer.

+0

Gracias Marc por su respuesta. Planeé implementar una solución IXmlSerializable pero finalmente la solución con el XmlChoiceIdentifier funciona bien. Gracias de nuevo por su respuesta – Khoumbe

+0

Es posible, y no es difícil - vea la respuesta aceptada para http://stackoverflow.com/ preguntas/2006482/c-sharp-xml-serialization-disable-rendering-root-element-of-array –

6

En caso si usted realmente necesita la salida exacta, como se especifica anteriormente, se puede usar solución como esta:

[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

Andrey Quiero agradecerle por esta solución La implemento y hace lo que yo sabía que no es una solución limpia, pero voy a utilizar el tiempo el editor de fuentes Xml corregir t heredero de salida Thansk de nuevo 1000 veces – Khoumbe

Cuestiones relacionadas