J'ai un flux contenant xml dans le format suivant que je veux désérialiser en C# objetsPourquoi XmlReader ajoute-t-il un espace de nom uris à chaque élément?
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<OrganisationMetaData xmlns="urn:organisationMetaDataSchema">
<Organisations>
<Organisation>
<Code>XXX</Code>
<Name>Yyyyyy</Name>...
Je l'ai fait plein de fois avec des chaînes, mais avec le flux, il est bien vouloir l'espace de noms Annexer des attribuer à tous les éléments complexes. Si je supprime simplement l'attribut xmlns, et oublie de le valider par rapport à un schéma, il ajoute juste un attribut xmlns vide. Le problème que j'ai est que la méthode Deserialize dans XmlSerializer (?), Jette une erreur disant qu'il n'attend pas l'attribut. J'ai essayé de décorer la classe avec les attributs XmlRoot et XmlType mais cela n'a rien changé.
est ici la classe que je veux désérialiser dans
[XmlRoot(
ElementName = "OrganisationMetaData",
Namespace = "urn:organisationMetaDataSchema")]
public class OrganisationMetaData
{
public List<Organisation> Organisations { get; set; }
}
[XmlType(
TypeName = "Organisation",
Namespace = "urn:organisationMetaDataSchema")]
public class Organisation
{
public string Code {get; set;}
public string Name {get; set;}
}
Voici la méthode qui est utilisée pour faire le travail
public IList<Organisation> DeserializeOrganisations(Stream stream)
{
var serializer = new XmlSerializer(typeof(OrganisationMetaData));
var mappingAssembly = //Resource in another assembly
var schemas = new XmlSchemaSet();
schemas.Add(
"urn:organisationMetaDataSchema",
XmlReader.Create(
mappingAssembly.GetManifestResourceStream(
// An xml schema
)
)
);
var settings = new XmlReaderSettings()
{
ValidationType = ValidationType.Schema,
Schemas = schemas,
ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings
};
settings.ValidationEventHandler += settings_ValidationEventHandler;
var reader = XmlReader.Create(stream, settings);
var metaData= (OrganisationMetaData)serializer.Deserialize(reader);
return metaData.Organisations.ToList();
}
J'ai essayé cela en utilisant DataContractSerializer mais qui apporte ses propres oppotunities pour apprendre, donc si quelqu'un pouvait aider avec ce que je devrais mettre dans les attributs pour faire fonctionner XmlSerializer, ce serait génial.
Toute aide serait appréciée, merci.
Merci Marc, je vais avoir un peu de cerveau à présent. Mon fichier XML n'a pas les guillemets simples que votre chaîne a. Comment surmonteriez-vous cela, quelque chose d'aussi simple que Remplacer (...)? –
J'ai essayé à peu près tout ce que je peux penser ici, donc après environ 8 heures, j'ai abandonné et je suis parti pour DataContractSerializer à la place, qui à l'est peut en dire un peu plus sur ce qu'il n'aime pas sur le xml . Merci pour votre aide Marc :) –
@Mark - la citation unique n'a pas d'importance. Le code affiché doit désérialiser le fichier XML que vous avez cité. Pouvez-vous poster (ou envoyer un e-mail si vous le souhaitez) vos cours? Je suis sûr que je peux vous dire ce qui ne va pas ... –