Porada techniczna – uzupełnianie zmiennych o dane pliku XML

0

Witam,

Mam ponad 100 różnych zmiennych, do których zczytuję dane z pliku XML.
Plik XML jest tak skonstruowany że ma tylko jeden unikalny nod zgodny nazwą ze zmienną.
Za pomocą 100 instrukcji "monotonnie" ładuję wartości nodów z pliku XML:

znajdź w dokumencie Node = "Nazwa_Zmiennej"; >>> zmienna =  tekst_noda;

Następnie otwieram kolejny plik XML, który zawiera modyfikacje kilku - kilkunastu zmiennych:

<Node> - do podmienienia
<Node_Plus> - wartość dodawana do zmiennej
<Node_Time> - wartość przez którą parametr jest mnożony.

Teraz pytanie:
Czy jest jakaś prostsza metoda na załadowanie danych z plików XML do zmiennych, czy też jest konieczne wklepanie dla 100 zmiennych 300 linijek kodu typu:

znajdź w dokumencie Node = "Nazwa_Zmiennej";
zmienna =  tekst_noda;
znajdź w dokumencie Node = "Nazwa_Zmiennej_Plus";
zmienna =+  tekst_noda;
znajdź w dokumencie Node = "Nazwa_Zmiennej_Razy";
zmienna = zmienna * tekst_noda;
0

Wymyśliłem jakby to mogło wyglądać - niestety nie wiem czy to jest możliwe w realizacji:

  1. zapytuję metodę o wynik poprzez zmienną: zmienna = metoda(zmienna);
  2. metoda odczytuje nazwę zmiennej (konwertując ją na string) oraz jej wartość;
  3. w plik XML odszukiwany jest taki sam string, ewentualnie string + "PLUS", czy string + "_TIME";
  4. metoda wykonuje odpowiednie podstawienia lub przeliczenia (lub nic nie robi przy braku informacji o zmianach);
  5. metoda zwraca nową wartość do zmiennej;

Problemem jest punkt 2 - odczytywanie nazwy pierwotnej zmiennej po wysłaniu jej do funkcji.
Oczywiście mogę za każdym razem deklarować na nowo poszukiwany tekst, ale przy 100 zmiennych wydłuża mi to niepotrzebnie kod o 100 linijek albo i więcej, nie wspominając o możliwym błędzie w stringu opisującym zmienną a samej zmiennej.

0

Czy ktoś potrafi sobie wyobrazić to, co autor próbuje opisać?

0

Aż tak źle?

kod obecnie wygląda tak:

struct dane
{
int Napiecie;
// i 130 innych wskaźników, kontrolek itp.
}
static void Main(string[] args)
{
int test;
...
test = "Napiecie";
Napiecie = ask_xml(test, xml_path, 50);       //50 wartość domyśla zwracana jeżeli w XMLu nie odnaleziono, jest <0 lub nie jest liczbą
Napiecie = Napiecie + ask_plus(test, xml_path_1);
Napiecie = Napiecie * ask_time(test, xml_path_2);
}
int ask_xml(string ask, string file_path, int value)
{
            XmlDocument XmlDoc = new XmlDocument();
            XmlDoc.Load(file_path);
            ask = XmlDoc.GetElementsByTagName(ask).Item(0).InnerText;
            //sprawdz czy string jest numerem;
            data = ask;
            return data;
}

Plik XML:

<root>
<Napiecie>20</Napiecie>
<Natezenie>1<Natezenie>
</root>

Zmiennych jak "Napiecie" mam około 130. Przy 130 kontrolkach kod jest mało czytelny (zwłaszcza w części deklaracji zmiennej "test" i wywołania metody) i pytam czy da się go uprościć.

Czynnością dla mnie bez sensu jest podanie nazwy zmiennej (test = "Napiecie") i wyslanie tak stworzonego stringa do metody przeszukującej XMLa o nod "Napicie", po to, żeby jej wartość wpisać do zmiennej o nazwie "Napiecie".

Przy okazji pytanie: czy mi się zdaje, czy w tej operacji (dla 130 kontrolek) plik jest otwierany 130 razy pod rząd?

0

Deserializacja XML

0

Ja mimo chęci nie bardzo rozumiem co chcesz osiągnąć, bo z tego co rozumiem masz plik xml z jakimiś danymi startowymi, ok 100 zmiennych i pliki xml które je modyfikuja na podstawie postfixu w nazwie węzłów.
Opisz problem bo opisując rozwiązanie trochę zaciemniasz...

0
Panczo napisał(a):

Ja mimo chęci nie bardzo rozumiem co chcesz osiągnąć, bo z tego co rozumiem masz plik xml z jakimiś danymi startowymi, ok 100 zmiennych i pliki xml które je modyfikuja na podstawie postfixu w nazwie węzłów.
Opisz problem bo opisując rozwiązanie trochę zaciemniasz...

static void Main(string[] args)
{
int test;
...
test = "Napiecie";
Napiecie = ask_xml(test, xml_path, 50);       //50 wartość domyśla zwracana jeżeli w XMLu nie odnaleziono, jest <0 lub nie jest liczbą
Napiecie = Napiecie + ask_plus(test, xml_path_1);
Napiecie = Napiecie * ask_time(test, xml_path_2);
}

Da się prościej to zapisać niż w postaci 4 linijek?
100 zmiennych x 4 = 400 linijek kodu.

2

Da się prościej to zapisać niż w postaci 4 linijek?

Pewnie:

> test = "Napiecie";
> Napiecie = (ask_xml(test, xml_path, 50) + ask_plus(test, xml_path_1,0)) * ask_time(test, xml_path_2,1);       //dodany 3 parametr do ask_plus i ask time: wartość zwracana przy braku wartości

100 zmiennych x 4 = 400 linijek kodu.

To i tak daje po skróceniu 200 linijek kodu, nie rozumiesz, że błąd polega na tym, że skupiasz się na tym że masz 4 linijki dla każdej ze 100 zmiennych, pomijając zupełnie fakt, że taka ilość sugeruje już uzycie jakiegoś zamiennika: tablica 2 wymiarowa, lista, klasa, kolekcja i później praca na tym w pętli.
To pachnie metodą copy&paste, Pomyśl co będzie jak przyjdzie plik w którym będziesz musiał zmniejszać wartości: napiszesz metodę ask_minus i POWIELISZ 100x dla każdej zmiennej! A w pętli tylko w jednym miejscu...

0

Kolega wyżej podsunął mi chyba najlepsze rozwiązanie problemu.
Przypomnę, że problem polegał na wyszukiwaniu wartości odpowiedniej zmiennej w kilku plikach XML, ale też kod miał sam rozpoznawać, czy dana wartość ma być podmieniona, przemnożona czy dodana do nowej (może też jej w ogóle nie być. tj. być niemodyfikowaną).

Rozwiązanie:
Deklaruję strukturę, gdzie do odpowiedniej wartości przypisuję numer tablicy:
Data [0] -> Napiecie

Deklaruję tablicę, która przechowuje nazwy kolejnych zmiennych jako stringi:
Zmienne[0] = "Napiecie";

Wystarczy potem przelecieć pętlą przez instrukcje:

foreach (int i in Zmienne)
{
Data[i] = zapytaj_o_wartosc_bazowa(Zmienne(i), path_xml);
Data[i] = zapytaj o modyfikacje_1(Zmienne(i), path_xml_1, Data[i]);
Data[i] = zapytaj o modyfikacje_2(Zmienne(i), path_xml_2, Data[i]);
}
zapytaj o modyfikacje_1(nazwa, path, value)
{
// przeszukaj po nodach (nazwa) i podmien;
// przeszukaj po nodach (nazwa + "_PLUS") i dodaj;
// przeszukaj po nodach nazwa + "_TIME" i przemnóż;
} 

Dziękuję za porady i sugestie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1