我正在尝试将 XML 反序列化为类。我可以得到一些值,但不能得到其他值。
下面是我只能获取到根节点中的Attribute的结果。其他节点的属性和元素不会被反序列化。
结果:
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 片段的适当属性)。
非常感谢:-)
最佳答案
看看你的 XML 和你的类,你说 PID 应该是一个属性,XML 没有 PID 作为属性,所以反序列化器自然找不到它。 类似地,您的类说 pName 将是一个元素,它会在根元素下查找 pName,但您的 XML 将 pName 嵌套在另一个元素下。
编辑: 处理完上述内容后,您可以将任何具有与数据类型匹配的适当属性的类传递给它,并且它应该可以工作。
链接:
关于c# - 将 XML 片段反序列化为 C# 类时无法获取某些元素和属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214270/