【问题标题】:Can't seem to deserialize very simple xml using XmlSerializer in c#似乎无法在 c# 中使用 XmlSerializer 反序列化非常简单的 xml
【发布时间】:2013-05-09 03:57:00
【问题描述】:

我觉得我要成功了。我已经写了一百个反序列化例程,但这一个要了我的命!

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我意识到这是一个老问题,但我最近遇到了同样的问题,并想分享对我有用的方法。我尝试了所有作为潜在解决方案列出的方法,但无法让它们中的任何一个起作用。即使在 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);
    }
    

    【讨论】:

      【解决方案2】:

      这会起作用

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

      【讨论】:

        【解决方案3】:

        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 The XML Serializer cannot deserialize a simpletype or a list of simple types 我不会这么肯定。 (顺便说一句:我的反对意见仅针对关于未来读者的虚假陈述,如果您将其删除并仅解释 DataContractReader,我将撤消我的反对意见)
        • 更新了声明。如果不添加根元素、指定命名空间或其他“技巧”,则不会。
        • 在哪里可以找到 DataContractSerializer?
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          您也可以使用一个简单的类来实现相同的结果。请注意,为简洁起见,我从您的 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;放; } }
          猜你喜欢
          • 2013-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          相关资源
          最近更新 更多