反序列化xml不提取对象

时间:2016-05-19 15:41:30

标签: c# 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包含许多内容。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您的<中缺少一些trueObject字符,并且您没有包含XmlUser类,但由于您报告了一个空对象而非例外,我'假设你拥有的东西真的没问题,那只是一个复制/粘贴错误。

如果正确设置xRoot上的属性,则无需单独声明XmlUsers对象。没有背景,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文件和类以匹配它。

所以现在反序列化的代码看起来像这样(注意,这包括我的固定trueObject字符串)

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

但实际上对象实际上是填充的!

答案 1 :(得分:0)

我做Tim 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);

现在解决方案正常。 谢谢你的帮助:))