Более простой способ запросить файл XML? C# - MVC. Net - PullRequest
0 голосов
/ 05 августа 2020

На данный момент мой код работает отлично, и нет никаких проблем, но я хотел получить информацию о том, есть ли более простой способ чтения XML файлов.

Итак, вот краткое изложение того, что я делаю :

  1. У меня есть большая программа, которая имеет дело с несколькими внешними факторами. В какой-то момент мне предоставляется файл XML, содержащий множество различных элементов и дочерних узлов.
  2. Для каждого ожидаемого элемента я создал класс с переменными, в которых будут храниться все данные из узла.

Мой XML файл выглядит не так, но вот простой пример, имитирующий его, чтобы вы лучше понимали, с чем я работаю.

   -<status>
   -<CallBase FilePath="EU\Domain Users" CallValid="True" CodedPath="D:\Users\CASE\" 
   TracePath="D:\Users\CASE\" StartEnviorment="" ServerLogs="" ServerPath="" ConfigPort="217757" 
   PacePort="217757" Version="2.5.0.73" Version2="10.3.0.73" VersionName="CASEservice" 
   LastTimeCheck="08/05/2020 15:05:07">
   <ValidPermissions Default=""/>
   </CallBase>
   </status>

Я создал класс для элемента CallBase под названием «CallBase», который содержит строки для FilePath, CallValid, CodedPath, TracePath, StartEnviorment, ServerLogs, ServerPath, ConfigPort, PacePort, Version и т. Д.

Вот как я чтение этого специфицированного c узла и сохранение его в объекте CallBase:

private CallBase getCallBaseData(List<XmlDocument> xmlDoc, int i)                                             
    {
        var result = xmlDoc[i].DocumentElement.SelectNodes("//CallBase");
        foreach (var node in result)
        {
            var temp1 = node.ToString();
        }

        XmlNode xmlNode = xmlDoc[i].SelectSingleNode("//CallBase");

        XmlSerializer serial = new XmlSerializer(typeof(CallBase));

        CallBase tempresult = (CallBase)serial.Deserialize(new XmlNodeReader(xmlNode));

        return tempresult;
    }

Однако теперь у меня есть масса одинаковых функций, и я заменяю «CallBase» другим именем элемента. Мне интересно, есть ли другой способ сделать это, чтобы у меня была только одна функция.

1 Ответ

2 голосов
/ 05 августа 2020

Набор методов, которые отличаются только типом элементов, можно заменить одним generi c методом .

К счастью, имя элемента xml совпадает с имя типа класса. Мы получим его оттуда с помощью свойства Type.Name .

private T GetData<T>(List<XmlDocument> xmlDoc, int i)
{
    var xpath = "//" + typeof(T).Name;

    var result = xmlDoc[i].DocumentElement.SelectNodes(xpath);

    foreach (var node in result)
    {
        var temp1 = node.ToString();
    }

    var xmlNode = xmlDoc[i].SelectSingleNode(xpath);

    var serial = new XmlSerializer(typeof(T));

    var tempresult = (T)serial.Deserialize(new XmlNodeReader(xmlNode));

    return tempresult;
}

Используя:

GetData<CallBase>(..., ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...