Ho diversi file XML con diversi elementi radice, ma lo stesso tipo di elementi figlio e vorrei poter creare una singola classe per contenere i diversi elementi radice e un'altra tenere ogni elemento figlio. Ecco due esempi di come sono i file XML.(De) serializzazione di diversi nomi di elementi radice utilizzando una classe
File 1:
<?xml version="1.0" encoding="utf-8" ?>
<Sandra>
<Address>
<Street></Street>
<Number></Number>
</Address>
</Sandra>
File 2:
<?xml version="1.0" encoding="utf-8" ?>
<John>
<Address>
<Street></Street>
<Number></Number>
</Address>
</John>
voglio essere in grado sia di serializzare e deserializzare questo usando solo 2 classi, come:
[Serializable]
[XmlRoot]
public class Person
{
[XmlElement("Address")]
public List<Address> Adresses { get; set; }
}
[Serializable]
public class Address
{
public string Street { get; set; }
public string Number { get; set; }
}
I ho provato a leggerli usando:
var ser = new XmlSerializer(typeof(Person));
var reader = XmlReader.Create("person1.xml");
var person = (Person)ser.Deserialize(reader);
ma ho "There is an error in XML document (2, 2)."
, perché il deserializzatore si aspettava un elemento <"Person">
radice e non un <"John">
o <"Paul">
. Funziona bene se cambio [XmlRoot]
a [XmlRoot("John")]
ma è esattamente quello che sto cercando di evitare qui.
Inoltre, devo essere in grado di serializzare nuovamente utilizzando la stessa strana struttura XML, quindi ho bisogno di memorizzare il nome dell'elemento radice all'interno della classe Person.
So che potrei semplicemente creare il mio (de) serializzatore ma vorrei sapere se è possibile raggiungerlo utilizzando i metodi esistenti.
Modifica 1: (riavvolto).
Modifica 2: ripristinato le modifiche di "Modifica 1" da quando ho trovato un modo più semplice per ottenere ciò di cui avevo bisogno. Vedi la mia risposta qui sotto.
Sì, è un po 'strano, anzi. Ma non spetta a me cambiare la struttura XML, devo solo leggere e scrivere rispettando questo formato. –