使用xmlns命名空间问题将XML反序列化为对象

问题描述 投票:0回答:1

您好我不断收到错误消息:

<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命名空间?

c# soap xml-deserialization
1个回答
1
投票

在反序列化结果之前,可以使用XmlTextReader忽略命名空间。此外,您的ArrayOfThemes类可能应该有一个主题数组,除非您只想到一个。下面的示例适用于反序列化该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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.