2016-05-19 5 views
0

Ich möchte eine XML-Zeichenfolge zu einem Objekt deserialisieren. Die Ausführung gibt keinen Fehler oder eine Ausnahme zurück. Ich suche im Netz, finde aber keine Lösung, die ich auf mein Problem anwenden kann.Deserialize eine XML das Objekt nicht extrahieren

XmlRootAttribute xRoot = new XmlRootAttribute(); 
xRoot.ElementName = "Get_mouvements_usersResult"; 
xRoot.Namespace = "urn:DME_Webservices"; 
xRoot.IsNullable = false; 

trueObject="<ns1:Get_mouvements_usersResult xmlns:ns1=\"urn:DME_Webservices\"><Obj_info_retour><flag_erreur>false</flag_erreur><libelle_erreur/><libelle_detail_erreur/></Obj_info_retour><tab_Cuser_mouvements><obj_cuser><IPP>02084</IPP><Id_user>4503843842</Id_user><civilite>Mme</civilite><nom_usuel>BOTTU</nom_usuel><nom_naissance>LOACU</nom_naissance><prenom>Alida</prenom><date_naissance>19340707</date_naissance><numro_sejour>31202084001</numro_sejour><date_deb_sejour>20150420113700</date_deb_sejour><code_lit>504</code_lit><code_etablissement>000312</code_etablissement></obj_cuser><tab_obj_Cmouvement>Id_mouvement>4505631384</Id_mouvement><date_mouvement>20150420113700</date_mouvement><code_mouvement>E</code_mouvement><Libelle_mouvement>Entre tablissement</Libelle_mouvement><code_ufh>ETG1</code_ufh><libelle_ufh>Etage 1-Chteau de Fermaincourt</libelle_ufh><code_ufm>SSR_HC_CONVA</code_ufm><libelle_ufm>Convalescence</libelle_ufm><Date_fin_mouvement>20150422152600</Date_fin_mouvement><code_lit>402</code_lit><comm_mouvement/>/tab_obj_Cmouvement><tab_obj_Cmouvement><Id_mouvement>4533166359</Id_mouvement><date_mouvement>20150422152600</date_mouvement><code_mouvement>M</code_mouvement><Libelle_mouvement>Mutation</Libelle_mouvement>code_ufh>ETG3</code_ufh><libelle_ufh>Etage 3 - La Chapelle Royale</libelle_ufh><code_ufm>SSR_HC_CONVA</code_ufm><libelle_ufm>Convalescence</libelle_ufm><Date_fin_mouvement>20150730142100</Date_fin_mouvement>code_lit>605D</code_lit><comm_mouvement/></tab_obj_Cmouvement><tab_obj_Cmouvement><Id_mouvement>5125097053</Id_mouvement><date_mouvement>20150730142100</date_mouvement><code_mouvement>M</code_mouvement><Libelle_mouvement>Mutation</Libelle_mouvement><code_ufh>ETG2</code_ufh><libelle_ufh>Etage 2 - Domaine de Comteville</libelle_ufh><code_ufm>SSR_HC_SDSG</code_ufm><libelle_ufm>Griatrie</libelle_ufm><Date_fin_mouvement/><code_lit>504</code_lit><comm_mouvement/></tab_obj_Cmouvement></tab_Cuser_mouvements></ns1:Get_mouvements_usersResult>"; 

MemoryStream stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(trueObject)); 

XmlSerializer serializer = new XmlSerializer(typeof(XmlUsers), xRoot); 

listXmlUserMove = (XmlUsers)serializer.Deserialize(stream); 

Ich habe diese Klassen:

[Serializable, XmlRoot("ns1:Get_mouvements_usersResult"), XmlType("ns1:Get_mouvements_usersResult")] 
    public class XmlUsers 
    { 
     [XmlElement("tab_Cuser_mouvements")] 
     public List<XmlUserMove> UserList { get; set; } 

     [XmlElement("Obj_info_retour")] 
     public SoapResult soapResult { get; set; } 
    } 

    [XmlType("Obj_info_retour")] 
    public class SoapResult 
    { 
     [XmlElement("flag_erreur")] 
     public string ErrorFlag { get; set; } 

     [XmlElement("libelle_erreur")] 
     public string ErrorName { get; set; } 

     [XmlElement("libelle_detail_erreur")] 
     public string ErrorDetails { get; set; } 
    } 

    [XmlType("tab_Cuser_mouvements")] 
    public class XmlUserMove 
    { 
     [XmlElement("obj_cuser")] 
     public XmlUser user { get; set; } 

     [XmlElement("tab_obj_Cmouvement")] 
     public List<XmlMove> MoveList { get; set; } 
    } 

    public class XmlUser 
    { 
     [XmlElementAttribute("IPP")] 
     public string IPP { get; set; } 

     [XmlElementAttribute("Id_patient")] 
     public string IdUser { get; set; } 

     [XmlElementAttribute("civilite")] 
     public string Title { get; set; } 

     [XmlElementAttribute("nom_usuel")] 
     public string UsedLastName { get; set; } 

     [XmlElementAttribute("nom_naissance")] 
     public string BirthLastName { get; set; } 

     [XmlElementAttribute("prenom")] 
     public string FirstName { get; set; } 

     [XmlElementAttribute("date_naissance")] 
     public string Birthday { get; set; } 

     [XmlElementAttribute("numero_sejour")] 
     public string RoomNumber { get; set; } 

     [XmlElementAttribute("date_deb_sejour")] 
     public string EntredDate { get; set; } 

     [XmlElementAttribute("code_lit")] 
     public string BedCode { get; set; } 

     [XmlElementAttribute("code_etablissement")] 
     public string DivisionCode { get; set; } 
    } 

    public class XmlMove 
    { 
     [XmlElement("Id_mouvement")] 
     public string MoveId { get; set; } 

     [XmlElement("date_mouvement")] 
     public string MoveDate { get; set; } 

     [XmlElement("code_mouvement")] 
     public string MoveCode { get; set; } 

     [XmlElement("Libelle_mouvement")] 
     public string MoveName { get; set; } 

     [XmlElement("code_ufh")] 
     public string ufhCode { get; set; } 

     [XmlElement("libelle_ufh")] 
     public string UfhName { get; set; } 

     [XmlElement("code_ufm")] 
     public string UfmCode { get; set; } 

     [XmlElement("libelle_ufm")] 
     public string UfmName { get; set; } 

     [XmlElement("Date_fin_mouvement")] 
     public string MoveEndDate { get; set; } 

     [XmlElement("code_lit")] 
     public string BedCode { get; set; } 

     [XmlElement("comm_mouvement")] 
     public string MoveComm { get; set; } 
    } 

Die listXmlUserMove Objekt enthalten nichts, aber die xml viele Dinge enthalten.

Kann mir bitte jemand helfen?

+0

Versuchen Sie https://blog.udemy.com/csharp-serialize-to-xml/ –

+0

Sieht aus, als ob Sie die XmlUser-Klassendefinition im bereitgestellten Code fehlen. – Zack

+0

Außerdem gibt es eine Reihe von Zeichen, die in Ihrer XML-Zeichenfolge 'trueObject' fehlen. Je nachdem, ob es sich um einen Kopier-/Einfügefehler beim Stack-Überlauf handelt oder nicht, können Sie Probleme verursachen oder nicht. – Zack

Antwort

1

Es gibt ein paar < Zeichen aus trueObject fehlt, und Sie nicht zählen die XmlUser Klasse, aber da Sie ein leeres Objekt gemeldet und nicht eine Ausnahme, ich gehe davon aus, was Sie haben wirklich in Ordnung ist, und dass war nur ein Kopier-/Einfügefehler.


Sie brauchen nicht die xRoot Objekt separat zu erklären, wenn Sie die Attribute auf XmlUsers richtig eingestellt bekommen. ns1 ist sinnlos ohne Kontext. Sie sollten die Namespace -Eigenschaft verwenden, um die Informationen zu diesen Attributen korrekt anzugeben.

[Serializable, XmlRoot("Get_mouvements_usersResult", Namespace = "urn:DME_Webservices"), XmlType("Get_mouvements_usersResult", Namespace = "urn:DME_Webservices")] 
public class XmlUsers 

Ihre Elemente wegen eines Namens Problem nicht kommen durch. Es wird angenommen, dass der Namespace XmlUsers für die Elemente in ihm gilt. In Ihrem eigentlichen XML befinden sie sich jedoch in einem anderen Namespace. Da sie keine xmlns definiert haben, sind sie im Standard-Namespace, einer leeren Zeichenfolge. Die Namensräume des Elements sollte explizit festgelegt werden:

[Serializable, XmlRoot("Get_mouvements_usersResult", Namespace = "urn:DME_Webservices"), XmlType("Get_mouvements_usersResult", Namespace = "urn:DME_Webservices")] 
public class XmlUsers 
{ 
    [XmlElement("tab_Cuser_mouvements", Namespace = "")] 
    public List<XmlUserMove> UserList { get; set; } 

    [XmlElement("Obj_info_retour", Namespace = "")] 
    public SoapResult soapResult { get; set; } 
} 

Wenn Sie alles in ns1 zu sein beabsichtigt hatte, dann werden Sie Ihre XML-Dateien und Klassen überarbeiten müssen, dass anzupassen.

So, jetzt der Code deserialisiert sieht wie folgt aus (beachten Sie, dies schließt meine feste trueObject String)

var trueObject="<ns1:Get_mouvements_usersResult xmlns:ns1=\"urn:DME_Webservices\"><Obj_info_retour><flag_erreur>false</flag_erreur><libelle_erreur/><libelle_detail_erreur/></Obj_info_retour><tab_Cuser_mouvements><obj_cuser><IPP>02084</IPP><Id_user>4503843842</Id_user><civilite>Mme</civilite><nom_usuel>BOTTU</nom_usuel><nom_naissance>LOACU</nom_naissance><prenom>Alida</prenom><date_naissance>19340707</date_naissance><numro_sejour>31202084001</numro_sejour><date_deb_sejour>20150420113700</date_deb_sejour><code_lit>504</code_lit><code_etablissement>000312</code_etablissement></obj_cuser><tab_obj_Cmouvement><Id_mouvement>4505631384</Id_mouvement><date_mouvement>20150420113700</date_mouvement><code_mouvement>E</code_mouvement><Libelle_mouvement>Entre tablissement</Libelle_mouvement><code_ufh>ETG1</code_ufh><libelle_ufh>Etage 1-Chteau de Fermaincourt</libelle_ufh><code_ufm>SSR_HC_CONVA</code_ufm><libelle_ufm>Convalescence</libelle_ufm><Date_fin_mouvement>20150422152600</Date_fin_mouvement><code_lit>402</code_lit><comm_mouvement/></tab_obj_Cmouvement><tab_obj_Cmouvement><Id_mouvement>4533166359</Id_mouvement><date_mouvement>20150422152600</date_mouvement><code_mouvement>M</code_mouvement><Libelle_mouvement>Mutation</Libelle_mouvement><code_ufh>ETG3</code_ufh><libelle_ufh>Etage 3 - La Chapelle Royale</libelle_ufh><code_ufm>SSR_HC_CONVA</code_ufm><libelle_ufm>Convalescence</libelle_ufm><Date_fin_mouvement>20150730142100</Date_fin_mouvement><code_lit>605D</code_lit><comm_mouvement/></tab_obj_Cmouvement><tab_obj_Cmouvement><Id_mouvement>5125097053</Id_mouvement><date_mouvement>20150730142100</date_mouvement><code_mouvement>M</code_mouvement><Libelle_mouvement>Mutation</Libelle_mouvement><code_ufh>ETG2</code_ufh><libelle_ufh>Etage 2 - Domaine de Comteville</libelle_ufh><code_ufm>SSR_HC_SDSG</code_ufm><libelle_ufm>Griatrie</libelle_ufm><Date_fin_mouvement/><code_lit>504</code_lit><comm_mouvement/></tab_obj_Cmouvement></tab_Cuser_mouvements></ns1:Get_mouvements_usersResult>"; 

MemoryStream stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(trueObject)); 

XmlSerializer serializer = new XmlSerializer(typeof(XmlUsers)); 

var listXmlUserMove = (XmlUsers)serializer.Deserialize(stream); 

Aber das Objekt tatsächlich am Ende aufgefüllt!

+0

Vielen Dank für Ihre Antwort.Ich habe die falsche Zeichenfolge in meine Frage kopiert. Es tut uns leid. Die richtige Zeichenfolge enthält keinen Fehler. Ich habe es auf dieser Website xmlbeautifier.com getestet. Ich habe vergessen, die XmlUser-Klasse zu kopieren. Ich werde es hinzufügen. – mister

+0

Ich hatte mit Ihrem Vorschlag geändert, aber jetzt habe ich einen Ausnahmefehler: " wurde nicht erwartet.". Aber wenn ich den xRoot hinzufüge, funktioniert es :). Danke für Ihre Hilfe :) – mister

0

ich tun, was Tim S. mir sagen, aber ich nicht entfernen XROOT:

XmlRootAttribute xRoot = new XmlRootAttribute(); 
xRoot.ElementName = "Get_mouvements_usersResult"; 
xRoot.Namespace = "urn:DME_Webservices"; 
xRoot.IsNullable = false; 

.

XmlSerializer serializer = new XmlSerializer(typeof(XmlUsers), xRoot); 

Jetzt funktioniert die Lösung gut. Vielen Dank für Ihre Hilfe :)

Verwandte Themen