2009-06-15 5 views
3

J'essaie de désérialiser un document XML et lorsque le desserializer rencontre une certaine étiquette à mi-chemin en bas de la doc, il donne l'erreur:sérialisation XML: System.InvalidOperationException: <tagname> n'a pas été prévu

System.InvalidOperationException <mytagname> was not expected. 

Il porte une balise [System.Xml.Serialization.XmlArrayItemAttribute("MyTagName", typeof(MediaFile))] juste avant le début de la classe, et l'erreur ne se produit que sur cette balise/classe particulière, mais je ne trouve rien de différent à ce sujet. Quelqu'un a déjà vu ça avant?

RÉVISÉ POUR PLUS DE DETAILS:

Voici le code désérialiseur:

String xmlString = _doc.ToString(); 
StringReader sr = new StringReader(xmlString);    
XmlReader xr = XmlReader.Create(sr); 
xs = new XmlSerializer(typeof(VideoAdServingTemplate<AdNode>)); 
objVast = (VideoAdServingTemplate<AdNode>)xs.Deserialize(sr); 

Et le XML en question ressemble à ceci:

<VideoAdServingTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd"> 
    <Ad id="myad"> 
     <InLine> 
      <AdSystem>MyAdSystem</AdSystem> 
      <AdTitle>Advertisement</AdTitle> 
      <Description>Shamwow</Description> 
      <Survey> 
       <URL><![CDATA[http://www.dynamiclogic.com/tracker?campaignId=234&site=yahoo]]></URL> 
      </Survey> 
      <Error> 
       <URL><![CDATA[http://www.primarysite.com/tracker?noPlay=true&impressionTracked=false]]></URL> 
      </Error> 
      <Impression> 
       <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?imp]]></URL> 
       <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?imp]]></URL> 
      </Impression> 
      <TrackingEvents> 
       <Tracking event="start"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?start]]></URL> 
       </Tracking> 
       <Tracking event="midpoint"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mid]]></URL> 
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?mid]]></URL> 
       </Tracking> 
       <Tracking event="firstQuartile"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?fqtl]]></URL> 
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?fqtl]]></URL> 
       </Tracking> 
       <Tracking event="thirdQuartile"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?tqtl]]></URL> 
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?tqtl]]></URL> 
       </Tracking> 
       <Tracking event="complete"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?comp]]></URL> 
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?comp]]></URL> 
       </Tracking> 
       <Tracking event="mute"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mute]]></URL> 
       </Tracking> 
       <Tracking event="pause"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?pause]]></URL> 
       </Tracking> 
       <Tracking event="replay"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?replay]]></URL> 
       </Tracking> 
       <Tracking event="fullscreen"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?full]]></URL> 
       </Tracking> 
       <Tracking event="stop"> 
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?stop]]></URL> 
       </Tracking> 
      </TrackingEvents> 
      <Video> 
       <Duration>00:00:15</Duration> 
       <AdID>AdID</AdID> 
       <VideoClicks> 
        <ClickThrough> 
         <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?click]]></URL> 
        </ClickThrough> 
        <ClickTracking> 
         <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL> 
         <URL id="athirdadsever"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL> 
        </ClickTracking> 
        <CustomClick> 
         <URL id="redclick"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL> 
         <URL id="blueclick"><![CDATA[http://www.thirdparty.com/tracker?click]]></URL> 
        </CustomClick> 
       </VideoClicks> 
       <MediaFiles> 
        <MediaFile delivery="streaming" bitrate="250" width="200" height="200" type="video/x-flv"> 
         <URL><![CDATA[rtmp://streamingserver/streamingpath/medium/filename.flv]]></URL> 
        </MediaFile> 
<MediaFile delivery="progressive" bitrate="400" width="200" height="200" type="video/x-flv"> 
         <URL><![CDATA[http://progressive.hostlocation.com//high/filename.flv]]></URL> 
        </MediaFile> 
        <MediaFile delivery="progressive" bitrate="200" width="200" height="200" type="video/x-flv"> 
         <URL><![CDATA[http://progressive.hostlocation.com/progressivepath/medium/filename.flv]]></URL> 
        </MediaFile> 
<!-- and a few more MediaFile tags --> 
</MediaFiles> 
</Video> 

Il y a un peu plus au XML mais c'est assez gros donc j'en ai beaucoup coupé. Je ne suis pas sûr de l'ordre dans lequel tout est désérialisée, tout ce que je sais, c'est la première erreur que je vois après avoir appelé xs.Deserialize() est:

Unhandled Error in Silverlight 2 Application 
Code: 4004  
Category: ManagedRuntimeError  
Message: System.InvalidOperationException: There is an error in XML document (1, 7). ---> System.InvalidOperationException: <MediaFile xmlns=''> was not expected. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderVideoAdServingTemplate1.Read27_VideoAdServingTemplate() 
    --- End of inner exception stack trace --- 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, Object events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader) 

Il n'y a aucune indication de ce qui était attendu ou pourquoi ce WASN Je ne m'attendais pas.

La classe qui l'implémente a cette définition pour associer la balise à un objet:

[System.Xml.Serialization.XmlArrayItemAttribute("MediaFile", typeof(MediaFile))] 
    public MediaFile[] MediaFiles 
    { 
     get 
     { 
      return this.mediaFilesField; 
     } 
     set 
     { 
      this.mediaFilesField = value; 
     } 
    } 

Je suppose que le [] dans la définition et l'utilisation de XmlArrayItemAttribute est parce qu'il ya plusieurs balises MediaFile dans un rangée, de sorte qu'ils sont placés dans un tableau. J'ai généré ce code avec xsd.exe et l'ai modifié légèrement pour fonctionner dans Silverlight.

+1

Etes-vous en train de sérialiser ou de désérialiser le code XML? Pouvez-vous fournir un morceau de XML et le code en question? –

+0

oups, ouais, désolé j'ai écrit ça très vite. J'ai ajouté plus de détails et plus de code. – nerdabilly

Répondre

0

Je m'assurerais que le XML est valide par rapport au même schéma que celui utilisé pour générer vos classes. Si vous avez toujours un problème, veuillez publier les trois ensembles de fichiers: le fichier XSD, le fichier XML et le fichier .cs.

1

Vous pourriez avoir besoin de passer le type MediaFile en tant KnownType au sérialiseur:

var knownTypes = new Type[] { typeof(MediaFile) }; 
xs = new XmlSerializer(typeof(VideoAdServingTemplate<AdNode>), knownTypes); 

Sinon, le sérialiseur ne sait pas ce nouveau type.

Questions connexes