Десериализация XML наследуемых типов с разными именами xml-элементов [duplicate]

Вы можете использовать метод fillna в DataFrame и указать метод как ffill (форвардная заливка):

>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df.fillna(method='ffill')
   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

Этот метод ...

распространять [s] последнее действительное наблюдение вперед к следующему действительному

blockquote>

. Чтобы перейти в другую сторону, существует также метод bfill.

Этот метод не изменяет DataFrame inplace - вам нужно будет перестроить возвращаемый DataFrame в переменную или указать inplace=True:

df.fillna(method='ffill', inplace=True)

17
задан skaffman 29 October 2009 в 12:53
поделиться

2 ответа

Есть три способа сделать это; либо вы можете использовать [XmlInclude] против типа, либо вы можете использовать XmlElement / XmlArrayItem против свойства. Все они показаны ниже; раскомментируйте пару, которую вы предпочитаете:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
public class MyWrapper {
    //2: [XmlElement("A", Type = typeof(ChildA))]
    //2: [XmlElement("B", Type = typeof(ChildB))]
    //3: [XmlArrayItem("A", Type = typeof(ChildA))]
    //3: [XmlArrayItem("B", Type = typeof(ChildB))]
    public List<ChildClass> Data { get; set; }
}
//1: [XmlInclude(typeof(ChildA))]
//1: [XmlInclude(typeof(ChildB))]
public abstract class ChildClass {
    public string ChildProp { get; set; }
}
public class ChildA : ChildClass {
    public string AProp { get; set; }
}
public class ChildB : ChildClass {
    public string BProp { get; set; }
}
static class Program {
    static void Main() {
        var ser = new XmlSerializer(typeof(MyWrapper));
        var obj = new MyWrapper {
            Data = new List<ChildClass> {
                new ChildA { ChildProp = "abc", AProp = "def"},
                new ChildB { ChildProp = "ghi", BProp = "jkl"}}
        };
        ser.Serialize(Console.Out, obj);
    }
}
43
ответ дан Marc Gravell 22 August 2018 в 04:00
поделиться
  • 1
    И теперь попробуйте применить это: [XmlRoot (ElementName = & quot; myWrapper & quot ;, Namespace = & quot; URL / & quot;)] public class MyWrapper – Brian J. Hakim 28 May 2012 в 08:06
  • 2
    Спасибо! стучал головой о кирпичную стену, пытаясь понять это. – iagomartinez 26 September 2012 в 11:35
  • 3
    Какой отличный ответ – sjclark76 24 March 2016 в 04:03
  • 4
    Обратите внимание, что метод 1 не работает для десериализации коллекции. Метод 2 или метод 3 необходим для десериализатора, чтобы выяснить, как сопоставить узлы в xml с элементами в коллекции. – Craig 6 July 2016 в 18:46

Для этого вы можете использовать XmlIncludeAttribute . Или посмотрите этот пост по другому пути.

5
ответ дан elder_george 22 August 2018 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: