2009-06-15 19 views
3

我試圖反序列化XML文件,並在desserializer遇到半路下來DOC一定的標籤,它給人的錯誤:XML序列化信息:System.InvalidOperationException:<tagname>預計不會

System.InvalidOperationException <mytagname> was not expected. 

它在課堂上有一個[System.Xml.Serialization.XmlArrayItemAttribute("MyTagName", typeof(MediaFile))]標記,並且錯誤只發生在這個特定的標記/類上,但是我找不到任何不同的東西來實現這種情況。有沒有人見過這個?

編輯的更多詳細信息:

這裏的解串器代碼:

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

,問題中的XML看起來是這樣的:

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

還有更多的XML有點但它很大,所以我減少了很多。我不知道在一切反序列化的順序,我所知道的是第一個錯誤我打電話xs.Deserialize(後見)是:

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) 

有沒有預期什麼的指示或者爲什麼這個WASN沒有預料到的。

實現它有這個定義的標籤與對象相關聯的類:

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

我假設[]中的定義和使用XmlArrayItemAttribute是因爲有多個媒體文件的標籤行,所以它們被放入一個數組中。我使用xsd.exe生成了該代碼,並稍微修改了它以在Silverlight中工作。

+1

您是序列化還是反序列化XML?你能提供一大塊XML和有問題的代碼嗎? – 2009-06-15 12:07:08

回答

0

我會確保XML對於用於生成類的相同架構有效。如果仍有問題,請發佈所有三組文件:XSD,XML和.cs文件。

1

您可能需要在傳遞媒體文件類型作爲KnownType到串行:

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

否則串行不知道這個新類型。