IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Désérialisé classe dont un élément contient du Xml


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Désérialisé classe dont un élément contient du Xml
    Bonjour,

    Mon problème est assez simple.

    J'ai déclaré un schéma Xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema id="SyncMLSpecification" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    	<xs:element name="SyncML">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="SyncHdr" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="SyncBody" maxOccurs="1" minOccurs="1"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="SyncHdr">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="VerDTD" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="VerProto" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="SessionID" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="MsgID" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="Target" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="Source" maxOccurs="1" minOccurs="1"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="SyncBody">
    		<xs:complexType>
    			<xs:choice>
    				<xs:element ref="Sync" minOccurs="1" maxOccurs="1"></xs:element>
    				<xs:element ref="Atomic" minOccurs="1" maxOccurs="1"></xs:element>
    			</xs:choice>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="VerDTD" type="xs:string"></xs:element>
    	<xs:element name="VerProto" type="xs:string"></xs:element>
    	<xs:element name="SessionID" type="xs:int"></xs:element>
    	<xs:element name="MsgID" type="xs:int"></xs:element>
    	<xs:element name="Target">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="LocName" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="LocURI" maxOccurs="1" minOccurs="0"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="Source">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="LocName" maxOccurs="1" minOccurs="1"></xs:element>
    				<xs:element ref="LocURI" maxOccurs="1" minOccurs="0"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="LocName" type="xs:string"></xs:element>
    	<xs:element name="LocURI" type="xs:anyURI"></xs:element>
    	<xs:element name="Sync">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="Add" minOccurs="1" maxOccurs="1"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="Atomic">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="CmdID" minOccurs="1" maxOccurs="1"></xs:element>
    				<xs:element ref="Replace" minOccurs="1" maxOccurs="unbounded"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="CmdID" type="xs:int"></xs:element>
    	<xs:element name="Add" type="xs:string"></xs:element>
    	<xs:element name="Replace">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="CmdID" minOccurs="1" maxOccurs="1"></xs:element>
    				<xs:element ref="Item" minOccurs="1" maxOccurs="1"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="Item">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref="Data" minOccurs="1" maxOccurs="1"></xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name="Data" type="xs:string">
    	</xs:element>
    </xs:schema>
    Via Visual Studio, j'ai généré les classes en utilisant la commande xsd.exe.

    Mais lorsque je désérialize mon fichier Xml via la classe XmlSerializer, il n'arrive pas lire ce qui est dans l'élément data (qui est un autre fichier Xml).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?xml version="1.0" encoding="UTF-8" ?>
    <SyncML>
      <SyncHdr>
        <VerDTD>1.1</VerDTD>
        <VerProto>SyncML/1.1</VerProto>
        <SessionID>1</SessionID>
        <MsgID>1</MsgID>
        <Target>
          <LocURI>http://www.blabla.com</LocURI>
          <LocName>AAAAA</LocName>
        </Target>
        <Source>
          <LocURI>http://www.blabla.com</LocURI>
          <LocName>XXXXXXX</LocName>
        </Source>
      </SyncHdr>
      <SyncBody>
        <Atomic>
          <CmdID>1</CmdID>
          <Replace>
            <CmdID>0</CmdID>
              <Item>
                <Data>
                  <ExpenseReportJournalEntry>
                    <actorRef>monicag</actorRef>
                  </ExpenseReportJournalEntry>
                </Data>
              </Item>
            </Replace>
          </Atomic>
        </SyncBody>
      </SyncML>
    Et voici le code c#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    StringReader stringReader = new StringReader(message);
     
                    SyncML contentMessageSyncML = null;
     
                    #region == Deserialize the message ==
                    try
                    {
                        XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(SyncML));
                        contentMessageSyncML = (SyncML)xmlSerializer.Deserialize(stringReader);
                    }
                    catch (InvalidOperationException ex)
                    {
                        if (ex.InnerException != null)
                            log.Warn("The message format is not valid", ex.InnerException);
                        else
                            log.Warn("The message format is not valid", ex);
     
                        return false;
                    }
    Que dois-je faire pour qu'il considère ce qu'il y a dans l'élément Data comme un string même si c'est de l' XML?

  2. #2
    Membre averti

    Inscrit en
    Septembre 2004
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 105
    Points : 339
    Points
    339
    Par défaut
    Ton XML doit ressembler à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?xml version="1.0" encoding="UTF-8" ?>
    <SyncML>
      <SyncHdr>
        <VerDTD>1.1</VerDTD>
        <VerProto>SyncML/1.1</VerProto>
        <SessionID>1</SessionID>
        <MsgID>1</MsgID>
        <Target>
          <LocURI>http://www.blabla.com</LocURI>
          <LocName>AAAAA</LocName>
        </Target>
        <Source>
          <LocURI>http://www.blabla.com</LocURI>
          <LocName>XXXXXXX</LocName>
        </Source>
      </SyncHdr>
      <SyncBody>
        <Atomic>
          <CmdID>1</CmdID>
          <Replace>
            <CmdID>0</CmdID>
            <Item>
              <Data>
                &lt;ExpenseReportJournalEntry&gt;
                  &lt;actorRef&gt;monicag&lt;/actorRef&gt;
                &lt;/ExpenseReportJournalEntry&gt;
              </Data>
            </Item>
          </Replace>
        </Atomic>
      </SyncBody>
    </SyncML>
    De cette façon, le sérializeur regardera le contenu de Data comme une string.

Discussions similaires

  1. classe dont le nom contient $
    Par étudiante_info dans le forum Android
    Réponses: 6
    Dernier message: 14/03/2011, 13h40
  2. Réponses: 3
    Dernier message: 12/10/2005, 11h06
  3. [JDOM] Ajout élément dans fichier XML
    Par delinot dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 18/07/2005, 11h10
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 16h05
  5. [xsl] Ajouter 1 élément à la page xml
    Par ametisse dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 10/03/2003, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo