5

次の例では、「[One xmlns=''] は予期されていませんでした。」例外

public abstract class BaseClass{ }

[XmlRoot("One")]
public class ChildOne : BaseClass {}

[XmlRoot("Two")]
public class ChildTwo : BaseClass { }

class Program
{
    private static void Main(string[] args)
    {
        var ser = new XmlSerializer(typeof (BaseClass), new Type[] {typeof (ChildOne), typeof (ChildTwo)});
        var obj1 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><One></One>"));
        var obj2 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><Two></Two>"));
    }
}

XML をデシリアライズする必要があります (私が生成したものではありません)。ルート タグには、別のクラスにマップする必要がある別の名前が付いている場合があります。

PS。このような質問がたくさんあることは知っています。私はそれらを研究しましたが、私の問題はまだ解決されていません。

4

2 に答える 2

1

答えを拡張するには、LinqToXml を少し使用して xml を解析し、ルート名を取得できます。

private T Deserialize<T>(string xml, Type[] knownTypes)
{
    var rootType = knownTypes.FirstOrDefault(t => t.GetCustomAttributes<XmlRootAttribute>()
                                                   .Any(a => a.ElementName == XElement.Parse(xml).Name.LocalName));

    return (T)new XmlSerializer(rootType ?? typeof(T), knownTypes).Deserialize(new StringReader(xml));
}
于 2013-08-08T03:23:00.813 に答える