我有来自第三方API的XML,如下所示:
<root>
<Data>
<sub_id>3</sub_id>
<email>something@something.test</email>
</Data>
<Data>
<sub_id>7</sub_id>
<email>test@what.biz</email>
</Data>
</root>
我想将它反序列化为这样的类:
public class root
{
//[XmlArray("Datas")]
[XmlArrayItem("Data", typeof(Data))]
public Data[] Data { get; set; }
}
public class Data
{
public int subscriber_id { get; set; }
public string email { get; set; }
}
但当然这不起作用。 如果我插入一个元素来包装“数据”元素的数组,那么我已经注释掉了“Datas”,它会修复它,但我不能。正如我所说的,这个XML来自第三方(对XML的工作方式有点松懈)。
这对于一些不同的C#代码/属性是否可行?
答案 0 :(得分:1)
删除类根并反序列化数组本身(也将class_id重命名为类Data中的sub_id)。这是代码
var serializer = new XmlSerializer(typeof(Data[]), new XmlRootAttribute("root"));
Data[] datas;
using (var tr = new StringReader(xml))
{
datas = (Data[])serializer.Deserialize(tr);
}
然而,如果你只需要反序列化并且源xml格式就像那样简单,那么你可以使用XLinq解析它,它更有效率(在我的机器上100万次反序列化时为10秒20秒):
var xml =
@"<root>
<Data>
<sub_id>3</sub_id>
<email>something@something.test</email>
</Data>
<Data>
<sub_id>7</sub_id>
<email>test@what.biz</email>
</Data>
</root>";
var xdoc = XDocument.Parse(xml);
foreach (var dataElem in xdoc.Root.Elements("Data"))
{
var subId = int.Parse(dataElem.Element("sub_id").Value);
var email = dataElem.Element("email").Value;
}
答案 1 :(得分:0)
xml没有格式错误。您所要做的就是使用[XmlElement]
代替[XmlArray]
。例如:
[XmlRoot("root")]
public class Root
{
[XmlElement]
public Data[] Data { get; set; }
}
public class Data
{
[XmlElement("sub_id")]
public int SubscriberId { get; set; }
[XmlElement("email")]
public string Email { get; set; }
}
我刚刚用你的样品测试了上面的内容并装得很好。