Laden...

Xml Struktur Konvertierung zu neuer Xml-Datei mit gleicher Struktur

Erstellt von NiclasPreski vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.684 Views
N
NiclasPreski Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren
Xml Struktur Konvertierung zu neuer Xml-Datei mit gleicher Struktur

Hallo alle Zusammen,
Ich Programmiere momentan eine Anwendung die zwei Xml Datein auslesen soll. Dabei ist eine mit Daten Gefühlt und die andere ist Leer(Protokoll). Nun soll das Protokoll mit Daten gefühlt werden und dabei werden nicht immer alle Daten aus der Gefüllten Datei verwendet. Dies soll dann ebenfalls als neue Xml Datei abgespeichert werden. Außerdem kann die Anordnung bei beiden komplett Unterschiedlich sein. Im meinem Folgende beispiel sollen "%" durch den Inhalt ersetzt werden. Nun lautet meine Frage wie stelle ich es an das die Neue Xml Datei die Selbe Struktur(Knoten Punkte, Rootknots usw) hat wie das Protokoll ? Die Konvertierung an sich gelingt mir jedoch nicht mehr die genau Anordnung. Ich hoffe man konnte verstehen wo drauf ich hinaus möchte, ich werde im Folgende den Xml Code Posten. Der C# Code meiner Seits ist leider viel zu aufwendig gestaltet. Ich Übergebe die Elemente und die Values immer einer Liste, dies mache ich auch für das Protokoll und Gleiche dann dies mit der Protokoll Liste ab. Ich würde mich über einen Allgemeinen Lösungsansatz sehr freuend das ich leider selber überhaupt keine Realisierungs Idee habe.

Bsp. Protokoll:

<?xml version="1.0" encoding="UTF-8"?>

-<ABLAUF>
   -<PROJEKT>
        <BESCHREIBUNG>% %</BESCHREIBUNG>
        <KUNDE>% %</KUNDE>
        <KUNDENNUMMER>% %</KUNDENNUMMER>
        <AUFTRAGSNUMMER/>
        <DATEI>% %</DATEI>
   </PROJEKT>
-<DEFINITION>
       <TYP>% %</TYP>
       <TRENNZEICHEN>% %</TRENNZEICHEN>
       <BEGRENZER>% %</BEGRENZER>
       <ZEICHENSATZ>% %</ZEICHENSATZ>
</DEFINITION>

Das Ergebnis nach der Convertierung:

-<JobFiles>
<Elemente>ABLAUF</Elemente>
<Svalue/>
</JobFiles>

-<JobFiles>
<Elemente>PROJEKT</Elemente>
<Svalue/>
</JobFiles>

-<JobFiles>
<Elemente>BESCHREIBUNG</Elemente>
<Svalue>TEST</Svalue>
</JobFiles>

-<JobFiles>
<Elemente>KUNDE</Elemente>
<Svalue>%myToys.de GmbH</Svalue>
</JobFiles>
-<JobFiles>

Niclas Preski

M
177 Beiträge seit 2009
vor 6 Jahren

Hast du XSLT Transformation in Betracht gezogen?

N
NiclasPreski Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren

Ehrlich gesagt, kannte ich es vorher noch nicht. Nach einer Intensiven Auseinandersetzung versteh ich jedoch noch nicht ganz wie genau man es Anwenden könnte ?

Niclas Preski

T
461 Beiträge seit 2013
vor 6 Jahren

Es geht darum ein StyleSheet (Xml-Vorlage) zu erstellen, nach dem die Protokolldateien oder was auch immer erstellt werden können. Mit so einer Vorlage sieht das Ergebnis immer gleich aus, bzw. so wie man es im StyleSheet definiert.

Wenn du jetzt das fertige Objekt zusammengestellt hast, kannst es mit dem StyleSheet ordentlich erstellen und brauchst dir keine Sorgen machen, daß etwas nicht passt. (wie auch immer...)

Hier die Funktion:
https://msdn.microsoft.com/en-us/library/ms163484.aspx

Im Prinzip müßtest nur die neue XML-Datei erstellen wie du sie benötigst und speichern.
Wenn es um die Reihenfolge der XML-Elemente geht, kannst diese noch vor dem Erstellen dementsprechend sortieren oder indexbasierend richtig einfügen.

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

N
NiclasPreski Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren

Es kann Leider kein XSL benutzt werden. Nicht weil ich dies nicht Realisiert hätte, sondern da der Anwender Immer eine XML Datei erstellt. Gibt es noch Vorschläge zur Lösung nur über XML?

Niclas Preski

3.003 Beiträge seit 2006
vor 6 Jahren

Es kann Leider kein XSL benutzt werden. Nicht weil ich dies nicht Realisiert hätte, sondern da der Anwender Immer eine XML Datei erstellt. Gibt es noch Vorschläge zur Lösung nur über XML?

Sorry, aber die Antwort ergibt nicht so richtig Sinn. Ein XSL ist eine Vorschrift, mit deren Hilfe man aus vorliegenden XML-Daten bestimmte Werte extrahiert und in einer anderen Form zusammenstellt. Man kann also auch aus vorliegenden XML-Daten (Messdaten) eine neue XML-Datei (Protokoll) erzeugen.

Das klingt schon genau so, als sei es dein Anwendungsfall.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 6 Jahren

Es kann Leider kein XSL benutzt werden. Nicht weil ich dies nicht Realisiert hätte, sondern da der Anwender Immer eine XML Datei erstellt. Gibt es noch Vorschläge zur Lösung nur über XML?

Noch zur Ergänzung von @LaTino, was genau meinst du der Anwender immer eine XML-Datei erstellt?

Wie erstellt er diese?

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

N
NiclasPreski Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren

Okey, ich glaube ich sollte ein bisschen präziser artikulieren. Ein Anwender hat ein XML Protokoll. Dieses beinhaltet alle Möglichen Knoten in einer X beliebigen Reihenfolge. Nun geht er hin und möchte dieses Protokoll mit Daten füllen die Ebenfalls in einer XML Datei sind. Die Anordnung der Daten ist bei beiden Dateien komplett Unterschiedlich. Jedoch beinhalten sie gleiche Werte.
Nun sollen also alle Daten aus der XML die mit Daten gefüllt ist in das Protokoll eingefügt werden und die Anordnung der Knoten des Protokolls soll dabei Ebenfalls übernommen werden.
Ein kurzes Beispiel:
Dies sind die Daten:
<test>
<auto>
<Marke>Hyundia</Marke>
</auto>
<lkw>
<Marke>Mercedes</Marke>
</lkw>
</test>

Dies wäre das Protokoll
<test>
<lkw>
<Marke></Marke>
</lkw>
<auto>
<Marke></Marke>
</auto>
</test>

Dies sollte rauskommen:
Dies wäre das Protokoll
<test>
<lkw>
<Marke>Mercedes</Marke>
</lkw>
<auto>
<Marke>Hyundia</Marke>
</auto>
</test>

Wichtig ist das es auf die Allgemeinheit ankommt. Es werden immer unterschiedliche Protokolle und Daten "Konvertiert", die auch immer anders Angeordnet sind.
Ich hoffe jetzt ist das Problem noch mal deutlich geworden. Ich weiß das man es mit XSL lösen könnte aber der Anwender kann ich diesem Fall keine XSL erstellen, da sich das aus Kosten und Zeit Gründen nicht lohnt. Die XML Dateien sind schon alle Vorhanden. Ich hoffe das mir hier jemand weiterhelfen kann.

Trotzdem noch mal vielen dank.

Niclas Preski

16.834 Beiträge seit 2008
vor 6 Jahren

Und was soll der Anwender dann machen? Eine UI Füllen, oder was soll er tun?
Vermutlich sind die potentiellen Hilfeleistungen hier dahingehend unpassend, weil Du nicht erklärst, wie der Workflow sein soll.

Du erklärst nur Ein -und Ausgang der Sitation; und da passt eben XLST.
Du sagst aber nichts, was eigentlich Workflow-basierend (durch den Anwender) passieren soll.

T
461 Beiträge seit 2013
vor 6 Jahren

Hm,

so wie ich das verstanden habe:

  1. Da sitzt eine Person, die eine XML-Datei zusammenbastelt und zwar direkt ohne UI (außer natürlich dem Texteditor??)
  2. Diese Datei verschickt sie wie auch immer zu einem Ziel, wo dann das Protokoll erstellt werden soll
  3. Die XML der Person und das Protokoll sehen von der Struktur her komplett identisch aus, der einzige Unterschied ist die Reihenfolge in der die Einträge drinnen stehen
  4. Das Protokoll wird irgendwo abgelegt

1-> sehr Fehlerhaft wenn dem so ist
2-> Daten-Sicherheit?
3-> Du erstellst das Protokoll mit einem Programm aus der XML-Datei, der einzige Unterschied ist die Reihenfolge der Einträge
4-> ...

Ist das so ungefär?

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

3.003 Beiträge seit 2006
vor 6 Jahren

Das leere Protokoll gibt also die Umformung vor, nach der die Daten in das Endprodukt umgeformt werden[1]. Was ich machen würde, wäre, mit einer xsl-Transformation das leere Protokoll in ein XSL umzuwandeln, und das dann auf die ursprünglichen Daten loszulassen. Aber vermutlich nur, um zu sehen, ob das geht.

Die pragmatischere Variante ist, alle Elemente im leeren Protokoll durchzugehen, und mit Hilfe ihres XPaths den Wert aus den Input-Daten auszulesen und im leeren Protkoll einzutragen. Am Ende hat man dann ein Dokument in der Form des leeren Protokolls, mit den Daten aus dem Input.

Das sind so die zwei Möglichkeiten, die mir einfallen.

LaTino
[1] klingt irgendwie, als hätte der Erfinder des Vorgangs XML in der Abendschule gelernt. Nichts gegen Abendschulen.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

N
NiclasPreski Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren

Genau, die 2 Variante trifft es sehr gut. Der Benutzer kann im Programm 2 XMl Dateien Hochladen. Eine ohne Daten, eine mit. Er sagt vorher welche die mit Daten ist und welche die ohne. Dann soll das Programm alle XML Elemente durchgehen und sie in das leere XML Dokument schreiben, an der richtigen stelle.
Nur ich weiß nicht wie man das genau Umsetzt. Gibt es zu der XPaths Variante vielleicht ein Beispiel?

Niclas Preski

3.003 Beiträge seit 2006
vor 6 Jahren

Du missverstehst. Das sind nicht zwei Varianten, wie man dein Problem verstehen könnte, sondern zwei Lösungen zu deinem Problem.

XPath lernen
Alle Elemente ermitteln
Element per Pfad auswählen

Das müsste dann alles sein, was du brauchst.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)