使用[XmlAttribute]的XML反序列化的空值

时间:2018-09-25 12:09:44

标签: c# xml-deserialization

我有以下XML;

<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
  <report_metadata>
    <org_name>example.com</org_name>
  </report_metadata>
</feedback>

和下面的Feedback.cs类;

   [XmlRoot("feedback", Namespace = "", IsNullable = false)]
    public class Feedback
    {
        [XmlElement("report_metadata")]
        public MetaData MetaData { get; set; }
    }


    [XmlType("report_metadata")]
    public class MetaData
    {
        [XmlAttribute("org_name")]
        public string Organisation { get; set; }
    }

当我尝试反序列化时,“组织”的值为null。

var xml = System.IO.File.ReadAllText("example.xml");
var serializer = new XmlSerializer(typeof(Feedback));
using (var reader = new StringReader(input))
{
    var feedback = (Feedback)serializer.Deserialize(reader);

}

但是,当我将Feedback.cs更改为以下内容时,它可以工作(显然,属性名称已更改)。

[XmlType("report_metadata")]
public class MetaData
{
    //[XmlAttribute("org_name")]
    public string org_name { get; set; }
}

我希望该属性为“组织”,而不是“ org_name”。

3 个答案:

答案 0 :(得分:1)

在示例XML文件org_name中,它是一个XML元素,而不是XML属性。在 [XmlAttribute("org_name")]属性中将[XmlElement("org_name")]更改为Organisation会将其反序列化为元素:

[XmlElement("org_name")]
public string Organisation { get; set; }

答案 1 :(得分:1)

可能只是拼写错误

[XmlAttribute("org_name")]
public string Organisation { get; set; }

应该是

[XmlElement("org_name")]
public string Organisation { get; set; }

答案 2 :(得分:1)

尝试修改您的Xml类,例如

[XmlRoot(ElementName = "report_metadata")]
public class MetaData
{
    [XmlElement(ElementName = "org_name")]
    public string Organisation { get; set; }
}

[XmlRoot(ElementName = "feedback")]
public class Feedback
{
    [XmlElement(ElementName = "report_metadata")]
    public MetaData MetaData { get; set; }
}

然后您将获得所需的输出,如

class Program
{
    static void Main(string[] args)
    {
        Feedback feedback = new Feedback();
        var xml = System.IO.File.ReadAllText(@"C:\Users\Nullplex6\source\repos\ConsoleApp4\ConsoleApp4\Files\XMLFile1.xml");
        var serializer = new XmlSerializer(typeof(Feedback));
        using (var reader = new StringReader(xml))
        {
            feedback = (Feedback)serializer.Deserialize(reader);
        }

        Console.WriteLine($"Organization: {feedback.MetaData.Organisation}");
        Console.ReadLine();
    }
}

输出:

enter image description here