我正在尝试将XML反序列化为类。我可以得到一些价值而不是其他价值。
下面是我只能在根节点中获取属性的结果。其他节点的属性和元素不会被反序列化。
结果:
CategoryId 850113
PersonId null
Name null
这是代码& XML:
void Main()
{
var xml = GetXml();
var x = Deserialize(typeof(GetCategoryResponse), xml);
x.Dump();
}
private object Deserialize(Type typeToDeserialize, string xmlString)
{
var xdoc = XDocument.Parse(xmlString);
var xRoot = new XmlRootAttribute { ElementName = xdoc.Root.Name.LocalName, IsNullable = false };
byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
var mem = new MemoryStream(bytes);
var ser = new XmlSerializer(typeToDeserialize, xRoot);
return ser.Deserialize(mem);
}
public class GetCategoryResponse
{
[XmlAttribute("cat")]
public string CategoryId { get;set; }
[XmlAttribute("pid")]
public string PersonId { get; set; }
[XmlElementAttribute("pname")]
public string Name { get; set; }
}
public string GetXml()
{
return @"<response cat=""850113"" abID=""var.can.do"" uid=""8a561340-fab0-4389-a01d-e13e103b3204"">
<test val=""cat"">
<messsage>There is a cat in the tree on my knee.</messsage>
</test>
<person pid=""4433"">
<pname>Cherry Pop</pname>
</person>
</response>";
}
我尝试使用XSD,但它生成的类绝对可怕 - 并且也无法正常工作。虽然我可以手动完成此操作,但我希望上面的Deserialize方法能够与传入的任何类一起工作(假设它具有映射到xml片段的正确属性)。
非常感谢: - )
答案 0 :(得分:0)
查看您的XML和您的类,您说PID应该是一个属性,XML没有PID作为属性,因此Deserializer自然无法找到它。 类似地,你的类说pName将是一个元素,它在根元素下查找pName,但你的XML将pName嵌套在另一个元素下。
编辑: 一旦你处理了上面的内容,你可以将任何类传递给它,它具有与数据类型匹配的适当属性,它应该可以工作。
链接: