2016-05-19 19 views
0

XML文字列をオブジェクトに逆シリアル化したい。実行はエラーまたは例外を戻しません。私はネットで検索しますが、自分の問題に適用できる解決策は見つかりません。xmlを非直列化してオブジェクトを抽出しない

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); 

私は、これらのクラスを持っている:

[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; } 
    } 

listXmlUserMoveオブジェクトが何も含まれていませんが、XMLは多くのものが含まれています。

いずれかが私を助けることができますか?

+0

お試しくださいhttps://blog.udemy.com/csharp-serialize-to-xml/ –

+0

提供されているコードにXmlUserクラス定義が不足しているようです。 – Zack

+0

また、 'trueObject' XML文字列から文字列が欠落しています。スタックオーバーフロー時にコピー/ペーストエラーが発生したかどうかによって、問題が発生する場合と発生しない場合があります。 – Zack

答えて

1

はあなたtrueObjectから欠落しているいくつかの<文字があり、そしてあなたはXmlUserクラスが含まれていませんでしたが、あなたは空のオブジェクトではなく、例外を報告するので、私はあなたが本当に大丈夫です持っているものと仮定し、そのよコピー/ペーストのエラーだけでした。


あなたが正しく設定XmlUsersの属性を取得する場合、別途xRootオブジェクトを宣言する必要はありません。 ns1は文脈なしで無意味です。これらの属性に情報を正しく与えるには、Namespaceプロパティを使用する必要があります。

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

あなたの要素があるため、名前空間の問題の貫通来ていません。 XmlUsersの名前空間は、その内部の要素に適用されるものとします。しかし実際のXMLでは、それらは異なる名前空間にあります。彼らはxmlnsが定義されていないので、空の文字列であるデフォルトの名前空間に入っています。要素の名前空間が明示的に設定する必要があります。

[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; } 
} 

あなたはns1内であることをすべてのものを意図していた場合、あなたはそれを一致させるために、あなたのXMLファイルとクラスを手直しする必要があります。デシリアライズする

だから今のコードは

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); 

(これは私の固定trueObject列を含む、ノート)しかし、オブジェクトが実際に最後に移入され、このようになります!

+0

あなたの答えをありがとう。私は質問に間違った文字列をコピーしました。ごめんなさい。正しい文字列にはエラーが含まれていません。私はこのサイトでxmlbeautifier.comをテストしました。私はXmlUserクラスをコピーするのを忘れました。私はそれを追加します。 – mister

+0

あなたの提案で修正しましたが、例外エラーが発生しました。 "は予期していませんでした。"しかし、私がxRootを追加すると、それは動作します:)。ご協力ありがとうございました :) – mister

0

私は何ティムS.は私に言うのですが、私は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); 

解決策は問題ありません。 ありがとうございました:)

関連する問題