Это может показаться странным для вас, но если вы собираетесь использовать огромное количество данных, то лично я бы выбрал решение для автоматически генерируемого кода.
Значение: сопоставить все ваши имена XML -> с их выражениями XPath -> для отображения имен и иметь что-то, что автоматически сгенерирует класс данных для вас.
Например:
Допустим, входной файл имеет формат CSV (или разделенный табуляцией и т. Д.):
Отображаемое, XMLField, XPathExpr
Имя, фамилия, / корабль / @ имя
Base_type, base_type, / корабль / base_type
GFX, GFX, / корабль / GFX
Теперь вам понадобится некоторый процесс, который будет автоматически генерировать из него код. Для этого вы можете разработать служебную программу для C #, использовать некоторый язык сценариев, например Perl, или даже создать какой-нибудь перевод XSL.
Конечный результат будет выглядеть примерно так:
class AutoGeneratedShipData
{
public AutoGeneratedShipData(XmlDocument xmlDoc)
{
// Code initialization like in your sample
}
public string Name ...
public string Base_type ...
public string GFX ...
}
Вы можете продолжить и добавить сериализацию, поддержку INotifyPropertyChanged и другие украшения, которые вы считаете нужными.
Другой подход
Было бы использовать отражение для загрузки данных в свойства, но для этого вам нужно будет вручную создать свойство для каждого элемента данных, а также отображение данных.
Вот пример:
LoadData(xmlDoc, "Name", "/ship/@name");
LoadData(xmlDoc, "Base_type", "/ship/base_type");
LoadData(xmlDoc, "GFX", "/ship/GFX");
Где LoadData()
будет что-то вроде:
private void LoadData(XmlDocument xmlDoc, Dictionary<string, string> propertyNameToXPathMap)
{
foreach ( PropertyInfo pi in this.GetType().GetProperties() )
{
// Is the property mapped to an xpath?
if ( propertyNameToXPathMap.ContainsKey(pi.Name) )
{
string sPathExpression = propertyNameToXPathMap[pi.Name];
// Extract the Property's value from XML based on the xpath expr.
string value = xmlDoc.SelectSingleNode(sPathExpression).Value;
// Set this object's property's value
pi.SetValue(this, value, null);
}
}
}
- Обратите внимание, что я игнорирую ваш
paths
словарь, потому что не вижу особой роли для него.