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

时间:2013-05-14 18:42:02

标签: c# xml visual-studio deserialization xml-deserialization

我觉得我要成功了。我已经写了一百个反序列化程序,但是这个正在杀了我!

以下是我从服务中返回的内容。一个非常简单的字符串数组......我想。

<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);

但是我在Deserialize行上出现以下错误:

<ArrayOfstring xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'> was not expected

我尝试过包含命名空间并创建各种异国情调的对象,以试图让它工作。疯狂的时间。最后我用JSON请求它,并用Json.net反序列化。

然而,我很好奇我做错了什么!

5 个答案:

答案 0 :(得分:4)

XML Serializer无法在没有附加规范的情况下反序列化简单类型或简单类型列表,但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 :(得分:3)

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

var serializer = new XmlSerializer(typeof(List<string>), 
                                   new XmlRootAttribute() { ElementName = "ArrayOfstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" });

答案 2 :(得分: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;
    }

答案 3 :(得分: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);
}

答案 4 :(得分: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);
}
相关问题