我觉得我要成功了。我已经写了一百个反序列化程序,但是这个正在杀了我!
以下是我从服务中返回的内容。一个非常简单的字符串数组......我想。
<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<string>Action & Adventure</string>
<string>Comedy</string>
<string>Drama</string>
<string>Family</string>
<string>Horror</string>
<string>Independent & World</string>
<string>Romance</string>
<string>Sci-Fi/Fantasy</string>
<string>Thriller & 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反序列化。
然而,我很好奇我做错了什么!
答案 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 & Adventure</string>
<string>Comedy</string>
<string>Drama</string>
<string>Family</string>
<string>Horror</string>
<string>Independent & World</string>
<string>Romance</string>
<string>Sci-Fi/Fantasy</string>
<string>Thriller & 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);
}