【问题标题】:Converting XML response to C# object - Error ( xmlns=''> was not expected )将 XML 响应转换为 C# 对象 - 错误(xmlns=''> 不是预期的)
【发布时间】:2017-04-09 09:21:22
【问题描述】:

我一直在尝试一系列相关主题中指定的提示和技巧,但没有任何成功。

由于某种原因,我无法将我的 XML 字符串反序列化为 C# 类对象。我因此错误而获得晋升:<DepartureBoard xmlns=''> was not expected.

我想获取子元素“Departure”作为具有其属性的对象并将这些对象添加到列表中。

这是来自 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# 类是使用“Paste as special”生成的。

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-array 返回为 null。如何访问 DepartureBoard 对象中的“Departure”数组?

最好的/ J

Debug screenshot

【问题讨论】:

    标签: c# xml deserialization


    【解决方案1】:

    Xml 文件不能以列表开头,它需要以根元素开头。在您的 xml 文件中,DepartureBoard 是根元素,而 Departure 是一个数组。您的课程使用以下带有 xml 文件的代码正常工作。

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

    【讨论】:

    • 我想通了。当我删除根元素中的命名空间属性时,离开数组被填满。我不确定这是否是解决问题的好方法,但至少我现在得到了数组!
    • 你走对了。您的 xml 文件没有命名空间。 xml 文件需要命名空间的 xmlns="xxx" 属性。
    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多