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 反序列化它。

但是我很好奇我做错了什么!

4

5 回答 5

5

当然 XmlSerializer 可以反序列化它。您只需要按如下方式创建 XmlSerializer

var serializer = new XmlSerializer(typeof(List<string>), 
                                   new XmlRootAttribute() { ElementName = "ArrayOfstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" });
于 2013-05-14T20:18:38.500 回答
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));
于 2013-05-14T19:13:25.530 回答
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);
}
于 2014-06-29T00:52:28.957 回答
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;
    }
于 2013-05-14T19:33:44.287 回答
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);
}
于 2019-03-07T19:06:58.103 回答