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

标签 c# xml deserialization

我正在尝试将 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 嵌套在另一个元素下。

编辑: 处理完上述内容后,您可以将任何具有与数据类型匹配的适当属性的类传递给它,并且它应该可以工作。

链接:

XML Serialization

Role of Attributes

关于c# - 将 XML 片段反序列化为 C# 类时无法获取某些元素和属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214270/

相关文章:

c# - 如何将接口(interface)作为参数传递给方法?

c# - 多线程运行时在哪里调用Control.Invoke/BeginInvoke?

java - Android - inflatinc 类错误 - java.lang.NumberFormatException

c# - 如何使用 LINQ-to-XML 将以下 XML 加载到字典中?

c++ - 使用 Boost 反序列化 Armadillo colvec

c# - Azure Blob 存储 - 更改容器的权限并使用 SAS 进行访问

c# - 可见性转换器绑定(bind)不起作用

php - 如何读取此 xml,获取 "parser error : CData section not finished"

java - 如何从 Java 反序列化概念中声明为 transient 的文件中检索成员?

powershell - 反序列化对象类型问题 - 特别是 Powershell 5 类和 Import-CliXml