使用 [XmlAttribute] xml 反序列化的空值
Null value on xml deserialization using [XmlAttribute]
我有以下 XML;
<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
<report_metadata>
<org_name>example.com</org_name>
</report_metadata>
</feedback>
及以下 Feedback.cs class;
[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; }
}
当我尝试反序列化时,组织的值为空。
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。
在示例 XML 中,文件 org_name
是一个 XML 元素,而不是 XML 属性。在 Organisation
属性 处将
[XmlAttribute("org_name")]
更改为 [XmlElement("org_name")]
会将其反序列化为元素:
[XmlElement("org_name")]
public string Organisation { get; set; }
可能只是打字错误
[XmlAttribute("org_name")]
public string Organisation { get; set; }
应该是
[XmlElement("org_name")]
public string Organisation { get; set; }
尝试将您的 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();
}
}
输出:
我有以下 XML;
<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
<report_metadata>
<org_name>example.com</org_name>
</report_metadata>
</feedback>
及以下 Feedback.cs class;
[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; }
}
当我尝试反序列化时,组织的值为空。
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。
在示例 XML 中,文件 org_name
是一个 XML 元素,而不是 XML 属性。在 Organisation
属性 处将
[XmlAttribute("org_name")]
更改为 [XmlElement("org_name")]
会将其反序列化为元素:
[XmlElement("org_name")]
public string Organisation { get; set; }
可能只是打字错误
[XmlAttribute("org_name")]
public string Organisation { get; set; }
应该是
[XmlElement("org_name")]
public string Organisation { get; set; }
尝试将您的 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();
}
}
输出: