我正在使用返回XML的API。如果我使用一组参数调用API,我将获得看起来像这样的XML:
类型1:
<root>
<foos>
<foo>some</foo>
<foo>text</foo>
<foo>here</foo>
</foos>
</root>
但是如果我使用另一组参数调用API,则会得到看起来像这样的XML:
类型2:
<root>
<foos>
<foo>
<fooName>some</fooName>
<fooId>1</fooId>
<fooDate>11-8-2019</fooDate>
</foo>
<foo>
<fooName>text</fooName>
<fooId>2</fooId>
<fooDate>11-9-2019</fooDate>
</foo>
<foo>
<fooName>here</fooName>
<fooId>3</fooId>
<fooDate>11-10-2019</fooDate>
</foo>
</foos>
</root>
如果可能的话,我想将其建模为单个C#对象,以便可以使用以下方式反序列化任一XML:
private root Deserialize(string xmlData)
{
var serializer = new XmlSerializer(typeof(root));
using (var reader = new StringReader(xmlData))
{
return (root)serializer.Deserialize(reader);
}
}
我曾尝试像这样对XML类进行建模:
[XmlRoot("root")]
public class Root
{
[XmlAttribute(AttributeName = "foos")]
public List<string> foos { get; set; }
}
[当类看起来像这样时,我可以反序列化类型1的xmlData(然后得到一个字符串列表)。但是,当我尝试反序列化类型2的xmlData时,一切都为空...
并且如果我像这样对XML类进行建模:
[XmlRoot("root")]
public class Root
{
[XmlAttribute(AttributeName = "foos")]
public List<Foo> foos { get; set; }
}
[XmlRoot("foo")]
public class Foo
{
[XmlAttribute(AttributeName = "fooName")]
public string FooName { get; set; }
[XmlAttribute(AttributeName = "fooId")]
public string FooId { get; set; }
[XmlAttribute(AttributeName = "fooDate")]
public string FooDate { get; set; }
}
然后,我可以反序列化类型2的xmlData(然后获得复杂对象的列表)。但是,当然对于类型1的xmlData不起作用。
是否有一种方法可以在C#中为类建模以处理这两种情况?
您可以做的是修改Foo
,使其可以通过添加字符串值属性并像这样用[XmlText]
标记它来捕获文本值和预期的嵌套子元素:
[XmlText]
注意:
[XmlRoot("root")] public class Root { [XmlArray("foos")] [XmlArrayItem("foo")] public List<Foo> foos { get; set; } } [XmlRoot("foo")] public class Foo { [XmlElement("fooName")] public string FooName { get; set; } [XmlElement("fooId")] public string FooId { get; set; } [XmlElement("fooDate")] public string FooDate { get; set; } [XmlText] public string Value { get; set; } }