Autor Beitrag
Eagle92
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 19.07.11 09:50 
Hallo Liebe Entwicklergemeinschaft,

Folgendes Problem bietet sich mir:

Ich soll so was wie einen Zeiger für meinen XML-Parser Deklarieren. Also es soll ein Identifikator sein der Datensätze zählt und dem Benutzer dann ausgibt. Besser wenn ich das mal anhand meiner XML-Datei beschreibe.

( ! Dabei ist bitte zu beachten das sich diese Struktur ins endlose fortsetzen kann ! )

Der User gibt also zum beispiel Modul 2 an

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<ModuleName>Modul_2</ModuleName>                <- Mit diesem Block soll gearbeitet werden.
  <GroupName>Group_2</GroupName>

  <Output>
    <Instanz>
      <InstanzName>Instanz_5</InstanzName>
      <VariableName>Variable_7</VariableName>
      <VariableType>double</VariableType>
      <InitialValue>15.2</InitialValue>         <- Identifikator speichert hier und rechnet jedesmal +1

      <InstanzName>Instanz_5</InstanzName>
      <VariableName>Variable_8</VariableName>
      <VariableType>int</VariableType>
      <InitialValue>306</InitialValue>
    </Instanz>

Das Problem was sich mir bietet ist einfach nur der Verweis auf den ModulNamen, kann mir da wohl jemand helfen ?

Ergebnis soll dann einfach so aussehen:

Welches Modul möchten sie ?
(User eingabe)
Ausgabe des Moduls.
Ausgabe des identifikators der Datensätze die es davor gibt,
Ausgabe des Identifikators der Datensätze die sich im Modul befinden.

Danke im Vorraus !

Mit freundlichen Grüßen

Patrick

Moderiert von user profile iconChristian S.: XML-Tags hinzugefügt
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 19.07.11 17:33 
hm... fast 50 Hits und keiner weiß Rat ? soll ich das ganze vielleicht noch ein bisschen genauer erläutern oder scheint das problem wirklich nen harter brocken zu sein ?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 19.07.11 17:40 
Hast du dich denn schon einmal mit einer XML-API auseinandergesetzt? XElement bringt z.B. genügend Navigationsmöglichkeiten mit, durch die du dein Programm umsetzen können solltest.

_________________
>λ=
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 19.07.11 20:57 
Hallo,
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
( ! Dabei ist bitte zu beachten das sich diese Struktur ins endlose fortsetzen kann ! )
Inwiefern?

Können innerhalb der XML n Module enthalten sein, und innerhalb des Moduls dann n Gruppen,
innerhalb einer Gruppe dann 1 Output- und 1 Input-Element, innerhalb eines dieses Elementes dann n Instanzen,
wobei eine Instanz n Variablen hat?

Dann ist die Struktur nicht wiklich gut! Denn es fehlen entscheidene Knoten. Für jede Sache muss ja quasi ein Knoten vorhanden sein. Und alles, was n Male vorkommen kann, muss ja in einer Gruppe (also wieder ein Knoten) zusammengefasst werden.

Und dann ist eine Abfrage per LinQ gar kein Problem mehr. Ich sage nicht, dass es auch nicht mit einer anderen Struktur gehen würde, aber dazu müsste man erstmal mehr wissen.

Eine ordentliche Struktur könnte jedenfalls wie folgt aussehen (wobei auch manche Elemente zu Attributen gemacht werden könnten, was auch wieder überichtlicher wäre)
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
<Module>
  <Modul>
    <ModulName>Modul_1</ModuleName>
    <Gruppen>
      <Gruppe>      
        <Gruppenname>Gruppe_1</Gruppenname>
        <Output>
          <Instanzen>
            <Instanz>
              <InstanzName>Instanz1</InstanzName>
              <Variablen>
                <Variable>
                  <VariableName>Variable_1</VariableName>
                  <VariableType>double</VariableType>
                  <InitialValue>15.2</InitialValue>
                </Variable>
              </Variablen>
            </Instanz>
          </Instanzen>
        </Output>    
        <Input>
          ...
        </Input>
      </Gruppe>
    </Gruppen>
  </Modul>
</Module>
Erstellst Du die XML denn selbst? Oder woher kommt sie?
LG
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 20.07.11 11:43 
Die Datei habe ich so bekommen und soll sie auch nicht verändern, beziehungsweise müsste ich das dann mit allen leuten absprechen die auch damit dann arbeiten, da es ja dann um die form der speicherung für die Daten geht. Das Ding sollte bis morgen stehen, deswegen ist das kein guter weg mehr ^^

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Hast du dich denn schon einmal mit einer XML-API auseinandergesetzt? XElement bringt z.B. genügend Navigationsmöglichkeiten mit, durch die du dein Programm umsetzen können solltest.


XML-API ? was ich ein bisschen herausgefunden habe ist, das ich mit ".Name" und ".Value" auf bestimmte sachen zugreifen rausgreifen kann, allerdings habe ich eine neue Idee zu diesem Thema
ist es mir möglich zum beispiel anhand von </Output> die sache zu beenden ?

In der Praxis würde das dann so aussehen:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<Output>
      <Instanz>
        <InstanzName>Instanz_1</InstanzName>
        <VariableName>Variable_1</VariableName>
        <VariableType>double</VariableType>
        <InitialValue>15.2</InitialValue>

        <InstanzName>Instanz_1</InstanzName>
        <VariableName>Variable_2</VariableName>
        <VariableType>int</VariableType>
        <InitialValue>306</InitialValue>
      </Instanz>

      <Instanz>
        <InstanzName>Instanz_2</InstanzName>
        <VariableName>Variable_3</VariableName>
        <VariableType>long</VariableType>
        <InitialValue>54418</InitialValue>
      </Instanz>
</Output>                                            ->               Block Ende.


Das ich mir quasi bis da alles ausgeben lasse was ich brauche. Nur der Befehl fehlt mir leider dafür ...
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 20.07.11 12:07 
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
XML-API ?
Ja, eine... API für... XML eben :zwinker: . Nachdem du dich ein wenig mit XElement/Linq to XML auseinandergesetzt hast, wirst du sehen, dass es überhaupt kein Problem ist, alle Kindknoten eines Elementes "Output" aufzuzählen.

_________________
>λ=
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 20.07.11 12:14 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
XML-API ?
Ja, eine... API für... XML eben :zwinker: . Nachdem du dich ein wenig mit XElement/Linq to XML auseinandergesetzt hast, wirst du sehen, dass es überhaupt kein Problem ist, alle Kindknoten eines Elementes "Output" aufzuzählen.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
foreach (var ModuleElement in rootElement.Elements("Output"))
                {
                                            
                    
                    foreach (var productNode in ModuleElement.Elements())
                    {
                       
                        foreach (var variableNode in productNode.Elements())
                        {
                                                     
                            
                            data.TypCalculationOutput(variableNode);
                        }
                    }                                      
                }


so was meinst du bestimmt ^^, das problem ist halt das ich in der Ausgabe immer nur den einen bestimmten knoten will mit allen inhalten, nicht die ganze Datei >.<
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 20.07.11 12:22 
ach und bezüglich


user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
( ! Dabei ist bitte zu beachten das sich diese Struktur ins endlose fortsetzen kann ! )
Inwiefern?

Können innerhalb der XML n Module enthalten sein, und innerhalb des Moduls dann n Gruppen,
innerhalb einer Gruppe dann 1 Output- und 1 Input-Element, innerhalb eines dieses Elementes dann n Instanzen,
wobei eine Instanz n Variablen hat?


ich meine damit das man da endlos viele Module dran gehängt werden können, die Struktur bleibt die gleiche.
Die Inhalte der Instanzen könnten auch um die gleichen Nodes, also Datensätze erweitert werden, das spielt aber keine Rolle. das habe ich schon geprüft und funktioniert wunderbar.

was halt für mich wichtig in der XML-Datei ist, ist dieser bereich:

ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
<ModuleName>Modul_1</ModuleName>                                                      -> Ab hier
<GroupName>Group_1</GroupName>
 
<Output>
      <Instanz>
        <InstanzName>Instanz_1</InstanzName>
        <VariableName>Variable_1</VariableName>
        <VariableType>double</VariableType>
        <InitialValue>15.2</InitialValue>

        <InstanzName>Instanz_1</InstanzName>
        <VariableName>Variable_2</VariableName>
        <VariableType>int</VariableType>
        <InitialValue>306</InitialValue>
      </Instanz>

      <Instanz>
        <InstanzName>Instanz_2</InstanzName>
        <VariableName>Variable_3</VariableName>
        <VariableType>long</VariableType>
        <InitialValue>54418</InitialValue>
      </Instanz>
</Output>    
        
<Input>
      <Instanz>
        <InstanzName>Instanz_3</InstanzName>
        <VariableName>Variable_4</VariableName>
        <VariableType>double</VariableType>

        <InstanzName>Instanz_3</InstanzName>
        <VariableName>Variable_5</VariableName>
        <VariableType>int</VariableType>
      </Instanz>


      <Instanz>
        <InstanzName>Instanz_4</InstanzName>
        <VariableName>Variable_6</VariableName>
        <VariableType>long</VariableType>
      </Instanz>
</Input>                                                                                -> bis hier ist Relevant für das Programm
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 20.07.11 14:02 
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
so was meinst du bestimmt ^^
Ja. Dann solltest du es doch jetzt schaffen, das richtige Modul auszuwählen und die relevanten Teile davon auszugeben.

_________________
>λ=
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 20.07.11 14:12 
Eben nicht ^^ genau da liegt mein problem >.<
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 21.07.11 07:37 
Guten Morgen,

habe jetzt eigentlich imer noch nicht begriffen, worin genau das Problem besteht.
Einfach nur das Element zu finden, dessen Namen der User eingegeben hat?

Vielleicht hilft Dir das weiter:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
List<XElement> moduleElements = doc.Descendants("ModuleName").ToList();
XElement selectedModule = moduleElements.FirstOrDefault(x => x.Value == userInput);
if (selectedModule != null)
{
  int selectedModuleNumberOfDoc = moduleElements.IndexOf(selectedModule);

  XElement groupElement = (XElement)selectedModule.NextNode;
  XElement outputNode = (XElement)groupElement.NextNode;
  XElement inputNode = (XElement)outputNode.NextNode;

  //tue was auch immer mit den Informationen               
}
Die Abfrage sieht nicht ganz so toll aus, das die Struktur so... ist. Aber Du hast ja gemeint, dass es sich im Moment nicht ändern lässt.
Hoffe, dass es das war, was Du benötigt hast.
LG
Eagle92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 21.07.11 11:49 
Hallo Trashkid,

Leider ist mir damit nicht geholfen =( ich hab einen eigenen Ansatz den ich dir mal rein stellen kann vielleicht hilft der dir für dein Verständnis meines Problems.
(entschuldige, ich krieg es irgend wie nicht auf die reihe es besser zu beschreiben.)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
foreach (var ModuleNameElement in rootElement.Elements("ModuleName"))
                {                    
                    ModuleName = ModuleNameElement.Value;
                    if (ModuleName == Modulconfig)
                    {
                        tempModul = ModuleName;
                        string SubModuleName = tempModul.Substring(61);                                          
                        foreach (var ModuleElement in rootElement.Elements("Output"))
                        {                                         
                            foreach (var productNode in ModuleElement.Elements())
                            {                               
                                foreach (var variableNode in productNode.Elements())
                                {
                                    data.TypCalculationOutput(variableNode);                                    
                                }
                            }
                        }                   
                    }
                    else
                    {
                        loops(rootElement);
                    }                    

                }
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 21.07.11 15:21 
Hallo,
user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
ich hab einen eigenen Ansatz den ich dir mal rein stellen kann vielleicht hilft der dir für dein Verständnis meines Problems.
Sorry, leider weiß ich immer noch nicht, wo genau das Problem liegt, was Du genau erreichen willst, oder wo Du nicht weiterkommst.

user profile iconEagle92 hat folgendes geschrieben Zum zitierten Posting springen:
(entschuldige, ich krieg es irgend wie nicht auf die reihe es besser zu beschreiben.)
Naja, bloß wie soll man denn dann weiterhelfen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 21.07.11 15:39 
Hallo Eagle92,

ein bißchen mehr Eigeninitiative wäre ganz nett.

Also deine XML-Datei sieht so aus:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
<ModuleName>Modul_1</ModuleName>
<GroupName>Group_1</GroupName>

<Output>
  ...
</Output>    
        
<Input>
  ...
</Input>

<ModuleName>Modul_2</ModuleName>
<GroupName>Group_2</GroupName>

<Output>
  ...
</Output>    
        
<Input>
  ...
</Input>

...

???

Dann kann nur der Ansatz von Trashkid2000 mittels "NextNode" funktionieren. Denn du willst doch nur die <Output> und <Input>-Knoten auslesen, welche direkt unterhalb der <ModuleName> bzw. <GroupName>-Elemente sind, oder?