无法使用c#中的XmlSerializer反序列化非常简单的xml

3

我感觉自己快要疯了。我已经写了一百个反序列化程序,但这一个正在折磨我!

以下是我从服务中获取的返回结果。一个非常简单的字符串数组……我想。

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <string>Action &amp; Adventure</string>
    <string>Comedy</string>
    <string>Drama</string>
    <string>Family</string>
    <string>Horror</string>
    <string>Independent &amp; World</string>
    <string>Romance</string>
    <string>Sci-Fi/Fantasy</string>
    <string>Thriller &amp; Crime</string>
</ArrayOfstring>

我正在使用开箱即用的反序列化功能。
var serializer = new XmlSerializer(typeof(List<string>));
var reader = new StringReader(xmlString);
var GenreList = (List<string>)serializer.Deserialize(reader);

但是在反序列化行上我遇到了以下错误:
<ArrayOfstring xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'> was not expected

我曾尝试包含命名空间并创建各种奇异的对象,以使其正常工作。浪费了大量时间。最终我请求返回JSON格式的数据,并使用Json.net将其反序列化。
不过,我很好奇我之前做错了什么!
5个回答

5
当然,XmlSerializer可以对其进行反序列化。您只需要按照以下方式创建XmlSerializer即可。
var serializer = new XmlSerializer(typeof(List<string>), 
                                   new XmlRootAttribute() { ElementName = "ArrayOfstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" });

4
XML序列化程序无法在没有额外说明的情况下反序列化简单类型或简单类型列表,但DataContractReader可以:
        string content = @"
        <ArrayOfstring xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
            <string>Action &amp; Adventure</string>
            <string>Comedy</string>
            <string>Drama</string>
            <string>Family</string>
            <string>Horror</string>
            <string>Independent &amp; World</string>
            <string>Romance</string>
            <string>Sci-Fi/Fantasy</string>
            <string>Thriller &amp; Crime</string>
        </ArrayOfstring>";

        var serializer = new DataContractSerializer(typeof(string[]));
        var reader = new XmlTextReader(new StringReader(content));
        var GenreList = new List<string>((string[])serializer.ReadObject(reader));

-1 XML序列化程序无法反序列化简单类型或简单类型列表 我不会这么肯定地说。(顺便说一句:我的反对票只是针对未来读者的错误陈述,如果您删除它并仅解释DataContractReader,我将撤销我的反对票) - I4V
更新了语句。如果没有添加根元素、指定命名空间或其他“技巧”,它就不行。 - jessehouwing
DataContractSerializer在哪里可以找到? - ecoe
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer%28v=vs.110%29.aspx - jessehouwing

0

您也可以使用一个简单的类来实现相同的结果。请注意,为了简洁起见,我从您的 XML 文件中删除了命名空间。如果您愿意,可以在序列化器中实现对命名空间的读取。

    public class ArrayOfstring
    {
        [XmlElement("string")]
        public List<string> strings;
    }

    private void Deserialize(string xmlString)
    {
        var serializer = new XmlSerializer(typeof(ArrayOfstring));
        var reader = new StringReader(xmlString);
        var GenreList = ((ArrayOfstring) serializer.Deserialize(reader)).strings;
    }

我尝试了这个,但仍然失败了。[XmlRoot] public class ArrayOfstring { [XmlElement("string")] public string[] Strings { get; set; }
}
- NER1808

0
这个会起作用。
DataContractSerializer xmlSer = new DataContractSerializer(typeof(string[]));
TextReader reader=new StreamReader(xmlString);
var stringArr= (string[])xmlSer.ReadObject(reader);
List<string> listStr=new List<>();
for(var s in stringArr)
{
listStr.Add(s);
}

0

我知道这是一个老问题,但最近我也遇到了同样的问题,想分享一下我的解决方法。我尝试了所有可能的解决方案,但都无法解决。即使在XmlRootAttribute方法中指定命名空间,仍会出现原始问题中报告的“未预期”的错误。我从API获取ArrayOfString作为响应,所以我使用了XDocument解析方法:

List<string> lstGenre = new List<string>();
var response = await client.PostAsync(url, content);
var responseString = await response.Content.ReadAsStringAsync();

XDocument xdoc = XDocument.Parse(responseString);
XNamespace ns = xdoc.Root.GetDefaultNamespace();
XElement root = xdoc.Element(XName.Get("ArrayOfString", ns.NamespaceName));
IEnumerable<XElement> list = root.Elements();
foreach (XElement element in list)
{
    string item = element.Value;  // <-- individual strings from the "ArrayOfString"
    lstGenre.Add(item);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接