views:

2403

answers:

0

I'm trying to de-serialize an XML Document and when the desserializer encounters a certain tag about halfway down the doc, it gives the error:

System.InvalidOperationException <mytagname> was not expected.

It has a [System.Xml.Serialization.XmlArrayItemAttribute("MyTagName", typeof(MediaFile))] tag right before it in the class, and the error is only happening on this one particular tag/class, but I can't find anything different about it that would make this occur. Anyone ever seen this before? thanks

EDITED FOR MORE DETAIL:

Here's the deserializer code:

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

And the XML in question looks like this:

<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&amp;site=yahoo]]&gt;&lt;/URL&gt;
      </Survey>
      <Error>
       <URL><![CDATA[http://www.primarysite.com/tracker?noPlay=true&amp;impressionTracked=false]]&gt;&lt;/URL&gt;
      </Error>
      <Impression>
       <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?imp]]&gt;&lt;/URL&gt;
       <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?imp]]&gt;&lt;/URL&gt;
      </Impression>
      <TrackingEvents>
       <Tracking event="start">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?start]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="midpoint">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mid]]&gt;&lt;/URL&gt;
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?mid]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="firstQuartile">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?fqtl]]&gt;&lt;/URL&gt;
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?fqtl]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="thirdQuartile">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?tqtl]]&gt;&lt;/URL&gt;
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?tqtl]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="complete">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?comp]]&gt;&lt;/URL&gt;
        <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?comp]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="mute">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?mute]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="pause">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?pause]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="replay">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?replay]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="fullscreen">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?full]]&gt;&lt;/URL&gt;
       </Tracking>
       <Tracking event="stop">
        <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?stop]]&gt;&lt;/URL&gt;
       </Tracking>
      </TrackingEvents>
      <Video>
       <Duration>00:00:15</Duration>
       <AdID>AdID</AdID>
       <VideoClicks>
        <ClickThrough>
         <URL id="myadsever"><![CDATA[http://www.primarysite.com/tracker?click]]&gt;&lt;/URL&gt;
        </ClickThrough>
        <ClickTracking>
         <URL id="anotheradsever"><![CDATA[http://www.thirdparty.com/tracker?click]]&gt;&lt;/URL&gt;
         <URL id="athirdadsever"><![CDATA[http://www.thirdparty.com/tracker?click]]&gt;&lt;/URL&gt;
        </ClickTracking>
        <CustomClick>
         <URL id="redclick"><![CDATA[http://www.thirdparty.com/tracker?click]]&gt;&lt;/URL&gt;
         <URL id="blueclick"><![CDATA[http://www.thirdparty.com/tracker?click]]&gt;&lt;/URL&gt;
        </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]]&gt;&lt;/URL&gt;
        </MediaFile>
        <MediaFile delivery="progressive" bitrate="200" width="200" height="200" type="video/x-flv">
         <URL><![CDATA[http://progressive.hostlocation.com/progressivepath/medium/filename.flv]]&gt;&lt;/URL&gt;
        </MediaFile>
<!-- and a few more MediaFile tags -->
</MediaFiles>
</Video>

There's a bit more to the XML but its pretty big so I cut a lot out of it. I'm not sure of the order in which everything is deserialized, all I know is the first error I see after calling xs.Deserialize() is:

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)

There's no indication of what was expected or why this wasn't expected.

The class that implements it has this definition to associate the tag with an object:

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

I assume that the [] in the definition and the use of XmlArrayItemAttribute is because there are multiple MediaFile tags in a row, so they are being placed into an array. I generated this code with xsd.exe and modified it slightly to work in Silverlight.

thanks!