如何反序列化具有两个具有相同名称但元素具有不同数据类型的元素的XML?

问题描述 投票:1回答:1

我正在使用返回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#中为类建模以处理这两种情况?

c# xml xmlserializer
1个回答
1
投票

您可以做的是修改Foo,使其可以通过添加字符串值属性并像这样用[XmlText]标记它来捕获文本值和预期的嵌套子元素:

[XmlText]

注意:

  1. [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; } }

© www.soinside.com 2019 - 2024. All rights reserved.