2017-04-09 18 views
0

我一直在嘗試一些相關主題中指定的技巧和竅門,但沒有取得任何成功。將XML響應轉換爲C#對象 - 錯誤(不期望xmlns ='>>

出於某種原因,我不能將我的XML字符串反序列化爲C#類對象。我得到提升這個錯誤:<DepartureBoard xmlns=''> was not expected.

我想獲取子元素「離開」作爲與它的屬性的對象,並將對象添加到列表。

這是從API的XML的數據響應(使它更短):

<?xml version="1.0" encoding="UTF-8"?> 
<DepartureBoard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://api.vasttrafik.se/v1/hafasRestDepartureBoard.xsd" servertime="01:52" serverdate="2017-04-09"> 
    <Departure name="SJ REGIONAL" sname="TÅG" type="VAS" stopid="9022014081600002" stop="Trollhättan station, Trollhättan" time="14:07" date="2017-04-09" journeyid="9015074172200363" direction="Göteborg" track="2" rtTime="14:07" rtDate="2017-04-09" fgColor="#00A5DC" bgColor="#ffffff" stroke="Solid"> 
    <JourneyDetailRef ref="longUrlHere" /> 
    </Departure> 
    <Departure name="VÄSTTÅGEN" sname="TÅG" type="VAS" stopid="9022014081600002" stop="Trollhättan station, Trollhättan" time="14:22" date="2017-04-09" journeyid="9015014172103251" direction="Göteborg" track="2" rtTime="14:22" rtDate="2017-04-09" fgColor="#00A5DC" bgColor="#ffffff" stroke="Solid"> 
    <JourneyDetailRef ref="longUrlHere" /> 
    </Departure> 
</DepartureBoard> 

這是我嘗試做轉變的方法:

public async Task<List<DepartureBoard>> GetDepartureBoard() 
    { 
     string url = "theApiUrlHere"; 
     HttpClient client = new HttpClient(); 
     string token = await oauth.RefreshToken(); 

     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
     HttpResponseMessage response = await client.GetAsync(url); 
     HttpContent content = response.Content; 
     HttpContentHeaders headers = response.Content.Headers; 

     byte[] mycontent = await response.Content.ReadAsByteArrayAsync(); 

     string xmlString = Encoding.Default.GetString(mycontent); 
     StringReader reader = new StringReader(xmlString); 

     List<DepartureBoard> result; 

     XmlSerializer xs = new XmlSerializer(typeof(List<DepartureBoard>), new XmlRootAttribute("Departure")); 

     result = (List<DepartureBoard>)xs.Deserialize(reader); 

     return result; 
    } 

C#的類是使用「粘貼爲特殊」生成。

using System; 
using System.ComponentModel; 
using System.Xml.Serialization; 
using System.Data.SqlTypes; 


/// <remarks/> 
[SerializableAttribute()] 
[DesignerCategoryAttribute("code")] 
[XmlTypeAttribute(AnonymousType = true)] 
/* I've tried adding both "http://www.w3.org/2001/XMLSchema-instance" 
    and "http://api.vasttrafik.se/v1/hafasRestDepartureBoard.xsd" to 
    the namespace attribute below without success. 
    It was left empty by default. */ 

[XmlRoot(Namespace = "", IsNullable = false)] 
public partial class DepartureBoard 
{ 

    private DepartureBoardDeparture[] departureField; 

    private string servertimeField; 

    private System.DateTime serverdateField; 

    /// <remarks/> 
    [XmlElementAttribute("Departure")] 
    public DepartureBoardDeparture[] Departure 
    { 
     get 
     { 
      return this.departureField; 
     } 
     set 
     { 
      this.departureField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string servertime 
    { 
     get 
     { 
      return this.servertimeField; 
     } 
     set 
     { 
      this.servertimeField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute(DataType = "date")] 
    public System.DateTime serverdate 
    { 
     get 
     { 
      return this.serverdateField; 
     } 
     set 
     { 
      this.serverdateField = value; 
     } 
    } 
} 

/// <remarks/> 
[SerializableAttribute()] 
[DesignerCategoryAttribute("code")] 
[XmlTypeAttribute(AnonymousType = true)] 
public partial class DepartureBoardDeparture 
{ 

    private DepartureBoardDepartureJourneyDetailRef journeyDetailRefField; 

    private string nameField; 

    private string snameField; 

    private string typeField; 

    private ulong stopidField; 

    private string stopField; 

    private string timeField; 

    private System.DateTime dateField; 

    private ulong journeyidField; 

    private string directionField; 

    private byte trackField; 

    private string rtTimeField; 

    private System.DateTime rtDateField; 

    private bool rtDateFieldSpecified; 

    private string fgColorField; 

    private string bgColorField; 

    private string strokeField; 

    /// <remarks/> 
    public DepartureBoardDepartureJourneyDetailRef JourneyDetailRef 
    { 
     get 
     { 
      return this.journeyDetailRefField; 
     } 
     set 
     { 
      this.journeyDetailRefField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string sname 
    { 
     get 
     { 
      return this.snameField; 
     } 
     set 
     { 
      this.snameField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string type 
    { 
     get 
     { 
      return this.typeField; 
     } 
     set 
     { 
      this.typeField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public ulong stopid 
    { 
     get 
     { 
      return this.stopidField; 
     } 
     set 
     { 
      this.stopidField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string stop 
    { 
     get 
     { 
      return this.stopField; 
     } 
     set 
     { 
      this.stopField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string time 
    { 
     get 
     { 
      return this.timeField; 
     } 
     set 
     { 
      this.timeField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute(DataType = "date")] 
    public System.DateTime date 
    { 
     get 
     { 
      return this.dateField; 
     } 
     set 
     { 
      this.dateField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public ulong journeyid 
    { 
     get 
     { 
      return this.journeyidField; 
     } 
     set 
     { 
      this.journeyidField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string direction 
    { 
     get 
     { 
      return this.directionField; 
     } 
     set 
     { 
      this.directionField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public byte track 
    { 
     get 
     { 
      return this.trackField; 
     } 
     set 
     { 
      this.trackField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string rtTime 
    { 
     get 
     { 
      return this.rtTimeField; 
     } 
     set 
     { 
      this.rtTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute(DataType = "date")] 
    public System.DateTime rtDate 
    { 
     get 
     { 
      return this.rtDateField; 
     } 
     set 
     { 
      this.rtDateField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlIgnoreAttribute()] 
    public bool rtDateSpecified 
    { 
     get 
     { 
      return this.rtDateFieldSpecified; 
     } 
     set 
     { 
      this.rtDateFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string fgColor 
    { 
     get 
     { 
      return this.fgColorField; 
     } 
     set 
     { 
      this.fgColorField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string bgColor 
    { 
     get 
     { 
      return this.bgColorField; 
     } 
     set 
     { 
      this.bgColorField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string stroke 
    { 
     get 
     { 
      return this.strokeField; 
     } 
     set 
     { 
      this.strokeField = value; 
     } 
    } 
} 

/// <remarks/> 
[SerializableAttribute()] 
[DesignerCategoryAttribute("code")] 
[XmlTypeAttribute(AnonymousType = true)] 
public partial class DepartureBoardDepartureJourneyDetailRef 
{ 

    private string refField; 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string @ref 
    { 
     get 
     { 
      return this.refField; 
     } 
     set 
     { 
      this.refField = value; 
     } 
    } 
} 

編輯

針對mkysoft

謝謝,我想我有點明白了現在好多了。當我從List更改爲DepartureBoard對象時,錯誤消失。儘管該對象將返回的Departure數組設置爲null。我如何訪問DepartureBoard對象內的「離開」數組?

最佳/ Ĵ

Debug screenshot

回答

0

的XML文件不能與名單開始,就需要先從根元素。在你的xml文件中,DepartureBoard是根元素,Departure是一個數組。您的課程正在使用xml文件的以下代碼正常工作。

DepartureBoard result; 
XmlSerializer xs = new XmlSerializer(typeof(DepartureBoard), new XmlRootAttribute("DepartureBoard")); 
result = (DepartureBoard)xs.Deserialize(reader); 
+0

我想通了。當我刪除根元素中的名稱空間屬性時,離開數組被填滿了。我不確定這是否是解決問題的好方法,但至少現在我已經得到數組了! – jeth0010

+0

你是對的。你的xml文件沒有命名空間。 Xml文件需要名稱空間的xmlns =「xxx」屬性。 – mkysoft

相關問題