将 XML 反序列化为具有 xmlns 命名空间问题的对象

Deserialize XML to object with xmlns namespace problem

您好,我一直收到错误消息:

<ArrayOfThemes xmlnx='http://brickset.com/api/'> was not expected.

尝试了一些我在互联网上找到的东西,但都失败了。

这是我调用 SOAP Api 时的 XML 输出:

    <ArrayOfThemes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://brickset.com/api/">
      <themes>
        <theme>4 Juniors</theme>
        <setCount>24</setCount>
        <subthemeCount>5</subthemeCount>
        <yearFrom>2003</yearFrom>
        <yearTo>2004</yearTo>
      </themes>
   </ArrayOfThemes>

类 :

public class Themes
    {
        [XmlElement("theme")]
        public string Theme { get; set; }
        [XmlElement("setCount")]
        public string SetCount { get; set; }
        [XmlElement("subthemeCount")]

        public string SubthemeCount { get; set; }
        [XmlElement("yearFrom")]

        public string YearFrom { get; set; }
        [XmlElement("yearTo")]

        public string YearTo { get; set; }
    }

    [Serializable, XmlRoot("ArrayOfThemes")]
    public class ArrayOfThemes
    {
        [XmlElement("themes")]
        public Themes Themes { get; set; }
    }

然后通常是通常的反序列化代码。仍然无法将 XML 对象转换为主题列表..

你如何处理 xmlns 命名空间?

在反序列化结果之前,您可以使用 XmlTextReader 忽略名称空间。 此外,您的 ArrayOfThemes class 可能应该有一系列主题,除非您只期望一个主题。下面的示例适用于反序列化 xml.

class Program
{
    static void Main(string[] args)
    {
        var xml = @"<ArrayOfThemes xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""https://brickset.com/api/"">
            <themes>
            <theme>4 Juniors</theme>
            <setCount>24</setCount>
            <subthemeCount>5</subthemeCount>
            <yearFrom>2003</yearFrom>
            <yearTo>2004</yearTo>
            </themes>
            </ArrayOfThemes>";
        var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        var reader = new XmlTextReader(ms) {Namespaces = false};
        var serializer = new XmlSerializer(typeof(ArrayOfThemes));

        var result = (ArrayOfThemes) serializer.Deserialize(reader);
    }
}

public class Themes
{
    [XmlElement("theme")]
    public string Theme { get; set; }
    [XmlElement("setCount")]
    public string SetCount { get; set; }
    [XmlElement("subthemeCount")]

    public string SubthemeCount { get; set; }
    [XmlElement("yearFrom")]

    public string YearFrom { get; set; }
    [XmlElement("yearTo")]

    public string YearTo { get; set; }
}

[Serializable, XmlRoot("ArrayOfThemes")]
public class ArrayOfThemes
{
    [XmlElement("themes")]
    public Themes[] Themes { get; set; }
}