2009-07-22 10 views
6

tengo una necesidad deserialización muy específico, consulte el ejemplo siguiente:¿Puede .NET XmlSerializer class deserialize InnerXml como una cadena?

decir que tengo la clase siguiente:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

y siguiendo XML

 
<Person> 
    <Name>John</Name> 
    <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> 
</Person> 

Lo que quiero es la clase XmlSerializer para deserializar InnerXml del elemento <PersonXml> a la propiedad PersonXml como una cadena. Me pregunto si se puede hacer.

NOTA: Sé que puedo codificar el contenido de <PersonXml> escapar caracteres XML ilegales, pero yo preferiría dejar el XML interno más amigable (no contiene & lt humana, y otras entidades que sólo se cofuse mi fin usuario)

Respuesta

3

Siempre puede implementar IXmlSerializable y hacer lo que desee a través de XmlReader.

+0

derecho, que no consideraba tales camino. Esto definitivamente resolvería mi problema, aunque esperaba alguna solución más barata :) ¡Gracias! –

+0

BTW, no necesita [Serializable] para la serialización de XML. [XmlElemenht ("Nombre")] también se puede omitir, ya que en este caso particular no cambia el comportamiento predeterminado de XMLSerializer. –

1

Entonces, aunque el elemento en realidad contiene elementos XML, ¿desea que .NET pretenda que es realmente una cadena? No creo que esto sea posible a través de la serialización estándar.

Sin embargo, se puede cargar el XML, transformar el PersonXml y debidamente escapar de ella y luego sustituir el contenido de la PersonXml con los datos recién escapado. Implicaría manipular manualmente el XML antes de deserializarlo, pero luego podría mantener los elementos XML bajo PersonXml.

+0

Sí, pero esto me parece demasiado complicado y una solución bastante feo :) –

0

¿Por qué no utilizar XML para representar XML? Simplemente use XmlElement para PersonXml.

Siempre es una mala idea pretender que XML es lo mismo que String.

0

La publicación es antigua, pero como estaba buscando una solución y tal vez mi respuesta podría ayudar a alguien.

¿Qué hay de

[XmlText] 
public string PersonXml { get; set; } 

Esto no va a resolver su problema, pero tal vez podría ser una alternativa aceptable.

En mi caso el PersonXml es un "buen-a-tener-elemento" que no siempre contiene XML. [XmlText] hace que PersonXml sea nulo cuando PersonXml contiene Xml. Sin embargo, cuando PersonXml contiene texto sin Xml, la deserialización es correcta.

En mi caso sin [XmlText], el Xml en PersonXml hace que los elementos antes de PersonXml se deserialicen correctamente, pero los elementos después de PersonXml se deserializan incorrectamente.

0

Exploré esta respuesta mientras buscaba una solución similar. No quería usar IXmlSerializable.

Por lo tanto, como referencia si alguien está viendo este problema en el futuro, puede usar el atributo XmlAnyElement para serializar el xml interno como XmlNode. Luego puede postprocesar el XmlNode como mejor le parezca, ejecutar la serialización por separado o simplemente obtener el texto de xml según sea necesario.

Para este ejemplo:

public class Person 
{ 

    public string Name { get; set; } 

    [XmlAnyElement] 
    public XmlNode PersonXml { get; set; } 

} 
+0

También vale la pena agregar el atributo [XmlText] a PersonXml. Esto incluirá y los nodos de texto que son hijos del nodo – user2346593