Есть ли способ десериализации атрибута XML в c#, чтобы он сопоставлялся со свойством, названным в честь элемента? - PullRequest
1 голос
/ 14 января 2020

У меня есть ситуация, когда мне нужно десериализовать XML для модели, а затем сопоставить эту модель с помощью автоматического преобразователя с другой моделью. Проблема заключается в том, что XML структурирован таким образом, что имена элементов соответствуют свойствам модели, на которую я изначально пытаюсь отобразить ... но по большей части фактические данные находятся в атрибуте с именем ' Val 'в элементе, например:

<Vehicle>
      <RegNo Val="ABC123A"/>
</Vehicle>

Теперь, я думаю, нормальный способ сделать такое отображение (я не беспокоился о элементе root!):


[XmlElement("Vehicle")]
public class Vehicle {
[XmlElement("Regno")]
public Regno Regno { get; set; }
}


public class Regno {
    [XmlAttribute]
    public string Val {get;set;}    
}

Это позволило бы XML отобразить на «удерживающий» объект, но это означает, что вместо того, чтобы ссылаться на строку с именем Regno, делая отображение на вторую модель довольно простым, мне пришлось бы ссылаться на Regno .val. Звучит немного, но в XML много элементов, и некоторые из них используют атрибуты с разными именами и тому подобное. То, что я действительно хотел бы сделать, это определить всю тяжелую работу в определении модели удержания, используя XMLAttributes et c. вдоль линий:

[XmlElement("Vehicle")]
public class Vehicle {
[XmlElement("Regno.Val")]
public string Regno { get; set; }
}

Так же, как возможность указать путь или квалифицированное имя значения. По сути, перемещение данных на одно место вверх по иерархии, если это имеет смысл!

Возможно ли это сделать? Я имею в виду, что я мог бы настроить сделанные на заказ сопоставления в автомате для перехода от модели удержания к основной модели, но было бы проще, если бы я мог просто go просмотреть свойства в сборках для каждой модели и отобразить одну из них в другую. Кроме того, учитывая, что не все атрибуты называются «Val», это может привести к некоторому беспорядку, и было бы лучше, если бы я мог разобраться с этим в самом начале, когда десериализованы данные.

Править : Следует добавить, что я попробовал подход «путь» и не смог заставить его работать, поэтому я должен был спросить «Я делаю это неправильно?»

...