Я пишу код для анализа XML-файла следующего формата (усеченного для простоты)
<?xml version="1.0" encoding="UTF-8"?>
<ship name="Foo">
<base_type>Foo</base_type>
<GFX>fooGFX</GFX>
....
</ship>
Я использую словарь, состоящий из пар ключей параметра и и xpath к значению, и запрашиваю его, чтобы загрузить все значения в различные переменные. Однако я замечаю, что будет огромное количество дублирования кода. Фактически, для каждого значения, которое я хочу получить, мне придется написать еще одну строку почти идентичного кода. Вот мой код:
class Ship
{
public Ship()
{
paths = new Dictionary<string, string>();
doc = new XmlDocument();
//Define path to various elements
paths.Add("name", "/ship/@name");
paths.Add("base_type", "/ship/base_type");
paths.Add("GFX", "/ship/GFX");
}
public void LoadFile(string filename)
{// Loads the file and grabs the parameters
doc.Load(filename);
Name = doc.SelectSingleNode(paths["name"]).Value;
Base_type = doc.SelectSingleNode(paths["base_type"]).Value;
GFX = doc.SelectSingleNode(paths["GFX"]).Value;
}
public Dictionary<string, string> paths; //The XPaths to the various elements, define them in constructor
public XmlDocument doc;
public string Name;
public string Base_type;
public string GFX;
}
Обратите внимание на дублирование здесь:
variable = doc.SelectSingleNode(paths["variable_name"]).value.
Будет еще много переменных, поэтому этот раздел будет объемным.
Есть ли способ упростить это? Если бы это был С++, я бы, наверное, попробовал указатели, но я знаю, что они не рекомендуются для использования в С#, так что есть ли аналогичный способ?
Я бы искал что-то, что я мог бы дать список имен переменных и xpaths, и чтобы код вытащил все значения и загрузил их в переменную в каком-то цикле или что-то в этом роде. Я хочу использовать XPath, потому что ожидаю, что формат этого файла может периодически меняться.
Любые идеи?
Заранее спасибо.
РЕДАКТИРОВАТЬ: я также хотел бы иметь возможность изменять эти данные и сохранять их обратно. Я не против сохранения всего нового дерева, если это необходимо, но было бы неплохо изменить данные на месте, если это возможно. Мне не нужно решение для модификации, но мне просто нужно, чтобы эта опция была открыта.