Как десериализовать XML с повторяющимся именем тега с уникальным идентификатором как атрибутом?

вы не будете использовать файл макета. Вместо этого укажите фон вашего заставки в качестве фона темы мероприятия. Для этого сначала создайте XML-чертеж в res / drawable.

Примечание: доступен весь код ниже GitHub Link




    

    
        
    


Здесь I Вы установили фоновый цвет и изображение.

Затем вы установите это как фоновый фон вашей всплеска в теме. Перейдите к файлу styles.xml и добавьте новую тему для вашей активности всплеска:



    
    

    


В новом SplashTheme установите атрибут фона фона для вашего XML-чертежа. Настройте это как тему своей активности всплеска в вашем AndroidManifest.xml:


    
        

        
    

Наконец, ваш класс SplashActivity должен просто перенаправлять вас на ваш основной вид деятельности:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Обратите внимание, что вы даже не создали представление для этого SplashActivity. Взгляд исходит из темы. Когда вы настраиваете пользовательский интерфейс для своей активности всплеска в теме, он доступен сразу.

Если у вас был файл макета для вашей активности всплеска, этот файл макета будет отображаться для пользователя только после вашего приложение полностью инициализировано, что слишком поздно. Вы хотите, чтобы всплеск отображался только за это небольшое количество времени до того, как приложение будет инициализировано.

1
задан Sebastien DErrico 13 July 2018 в 18:10
поделиться

3 ответа

Попробуйте следующее:

        XmlDocument doc = new XmlDocument();
        doc.LoadXml("yourxmlhere");

        Configuration configuration = new Configuration();
        XmlNode root = doc.FirstChild;
        if (root.HasChildNodes)
        {
            foreach (XmlNode item in root.ChildNodes)
            {
                configuration = SetValueByPropertyName(configuration, item.Attributes["name"].Value, item.FirstChild.InnerText);
            }
        }

Вспомогательный метод для установки значений:

public static TInput SetValueByPropertyName<TInput>(TInput obj, string name, string value)
        {
            PropertyInfo prop = obj.GetType().GetProperty(name);
            if (null != prop && prop.CanWrite)
            {
                if (prop.PropertyType != typeof(String))
                {
                    prop.SetValue(obj, Convert.ChangeType(value, prop.PropertyType), null);
                }
                else
                {
                    prop.SetValue(obj, value, null);
                }
            }
            return obj;
        }
1
ответ дан Rafael Herik 17 August 2018 в 12:16
поделиться

Загрузите xml в качестве документа

XmlDocument doc = new XmlDocument();
doc.LoadXml(your_xml_data);

Затем выполните итерацию через дочерние узлы

Configuration configuration = new Configuration();
XmlNode root = doc.FirstChild;

//fill the configuration from the child nodes.
if (root.HasChildNodes)
{
 if(root.ChildNodes[0].Name == "host")
 {
    configuration.host = root.ChildNodes[0].InnerText;
 }
 if(root.ChildNodes[1].Name == "port")
 {   
    configuration.port = root.ChildNodes[1].InnerText;
 }
}
1
ответ дан Any Moose 17 August 2018 в 12:16
поделиться
  • 1
    Спасибо, в этом коде есть предположение о сортировке, которую я не могу удалить без большого кода, например, если имя == & quot; host & quot; – Sebastien DErrico 13 July 2018 в 18:42
  • 2
    обновлено, чтобы проверить имя дочерних узлов и обновить правильное поле – Any Moose 13 July 2018 в 18:52

Вы можете назвать эту «старую школу», но она работает.

  1. Скопируйте XML (или фрагмент и т. д.) и используйте Visual Studio (2015 (?), а снимок - 2017 ) feature "Paste XML / JSON As Classes" Это очень помогает с допустимым XML - особенно с «правильными» атрибутами, которые украшают сгенерированные классы. Кроме того, это просто класс, поэтому вы можете настроить его по своему усмотрению (сохраняя атрибуты). Для более сложных XML - таких как пространства имен / префиксы, вы действительно оцените это. Если у вас нет этого инструмента, вы можете использовать XSD.exe (еще более старая школа) - делает то же самое для документов XML.
  2. Автогенерируемые классы сверху шаг: ... спотыкаясь о том, что у них одинаковое имя тега ... Не надо. Элементы XML могут повторяться - часто делают (например, sitemap.xml на каждом веб-сайте). Сгенерированный класс поможет вам понять его. Это стандартный набор / массив / список.
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class configuration
    {
    
        private configurationSetting[] settingField;
    
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("setting")]
        public configurationSetting[] setting
        {
            get
            {
                return this.settingField;
            }
            set
            {
                this.settingField = value;
            }
        }
    }
    
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class configurationSetting
    {
    
        private string valueField;
    
        private string nameField;
    
        /// <remarks/>
        public string value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
    }
    

С учетом вышеизложенного вы можете сделать это:

string rawXml = "<configuration><setting name=\"host\"><value>127.0.0.1</value></setting><setting name=\"port\"><value>80</value></setting></configuration>";

var ser = new XmlSerializer(typeof(configuration));
configuration config;
using (TextReader rdr = new StringReader(rawXml))
{
    config = (configuration)ser.Deserialize(rdr);
}


foreach (configurationSetting setting in config.setting)
{
    Console.WriteLine($"{setting.name} = {setting.value}");
}

Выход:

host = 127.0.0.1
port = 80

Hth ..

2
ответ дан EdSF 17 August 2018 в 12:16
поделиться
Другие вопросы по тегам:

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