无法获得某些元素和值的值将XML片段反序列化为C#类时的属性

时间:2014-03-06 03:30:22

标签: c# xml deserialization

我正在尝试将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片段的正确属性)。

非常感谢: - )

1 个答案:

答案 0 :(得分:0)

查看您的XML和您的类,您说PID应该是一个属性,XML没有PID作为属性,因此Deserializer自然无法找到它。 类似地,你的类说pName将是一个元素,它在根元素下查找pName,但你的XML将pName嵌套在另一个元素下。

编辑: 一旦你处理了上面的内容,你可以将任何类传递给它,它具有与数据类型匹配的适当属性,它应该可以工作。

链接:

XML Serialization

Role of Attributes