c# - Deserialice la matriz XML donde la raíz es la matriz y los elementos no siguen las convenciones
.net xml-serialization (1)
Tal vez usted puede intentar:
[XmlRoot("TERMS")]
public class TermData
{
public TermData()
{
terms = new List<Term>();
}
[XmlElement("TERM")]
public List<Term> terms{get;set;}
}
public class Term
{
[XmlElement("ID")]
public string id{get;set;}
[XmlElement("DESC")]
public string desc{get;set;}
}
Espero que esto ayude,
El XML que estoy obteniendo lo proporciona una fuente externa, por lo que no tengo la capacidad de reformatearlo fácilmente. Me gustaría usar atributos XML en mis entidades en lugar de tener que escribir una consulta de linq que sepa cómo se formatean el XML y la entidad. Aquí hay un ejemplo:
<?xml version="1.0"?>
<TERMS>
<TERM>
<ID>2013-2</ID>
<DESC>Spring 2013</DESC>
</TERM>
<TERM>
<ID>2013-3</ID>
<DESC>Summer 2013 Jun&Jul</DESC>
</TERM>
</TERMS>
Sé que el XMLSerializer espera ArrayOfTerm en lugar de TERMS, por ejemplo, pero puedo modificar mi entidad para usar un nombre de elemento diferente con los atributos xml como este:
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
public class Term
{
[XmlElement("ID")]
public string id;
[XmlElement("DESC")]
public string desc;
}
y estoy deserializando los datos como tal:
TermData data;
XmlSerializer serializer = new XmlSerializer(typeof(TermData));
using (StringReader reader = new StringReader(xml))
{
data = (TermData)serializer.Deserialize(reader);
}
return View(data.terms);
El problema al que me enfrento es que los TÉRMINOS son la raíz y la propia matriz. Si el XML tuviera un elemento raíz que no fuera la matriz, podría editar mi clase de TermData así y se deserializaría correctamente (ya probado).
[XmlRoot("ROOT")]
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
Tenga en cuenta que el uso de TÉRMINOS como XMLRoot no funciona. En este momento, mi código está tirando
InvalidOperationException: There is an error in XML document (2,2).
InnerException: "<TERMS xmlns=" was not expected.
Esto me llevaría a creer que el XML no está formateado correctamente, pero a mi entender, el ejemplo que di es un XML perfectamente válido.
Todo esto sería trivial si pudiera editar el código fuente xml, pero podría haber toneladas de otras respuestas como esta y necesito ser capaz de flexionar lo que sea que pueda obtener. Lo que estoy tratando de confirmar es si el XMLSerializer puede soportar este tipo de estructura XML. He probado casi todo y no puedo deserializarlo sin editar el XML. También sería conveniente si no tuviera que definir una clase de envoltura (TermData) para mantener la lista, pero esto parece funcionar solo si el xml sigue las convenciones de nomenclatura para el serializador (ArrayOfTerm, etc.).