Laden...

Daten aus DB in ein XML einlesen

Erstellt von Anna85 vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.218 Views
A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren
Daten aus DB in ein XML einlesen

verwendetes Datenbanksystem: <MSSQl Server>

Hallo,
falsch ich hier falsch bin, bitte mitteilen.

Ich bin totale Anfängerin, ich kann kaum programmieren, aber ich habe schon was gemacht.
Ich habe eine Tabelle mit 5 Spalten in meinem MSQL Server.
Ich habe eine XML Schema.
Ich muss die Daten aus der Tabelle in dieser XML Schema einspielen.
Ich habe gelesen, ich kann das mit Skalarfunktion machen, aber es funktioniert nicht, es lädt 0 Zeilen, also es ist was falsch (es kommt kein Fehler!:-))

Könnte mir jemand Schritt für Schritt sagen, wie ich das machen kann?

Viele Grüße aus Ulm
Anna

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo Anna85,

Naja, im einfachsten Fall machst du dir eine Konsolenapplikation, die die MSSQL-Datenbank ausliest, die Daten eventuell mappt und dann in dein XML schreibt.

Was hast du denn bisher gemacht? Hast du Code für uns?

Gruss

Coffeebean

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo Anna85,

geht es um das selbe Problem wie bisher od. ist es ein Neues?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
69 Beiträge seit 2019
vor 4 Jahren

Hallo Anna85,

wie sieht denn das XML-Schema und die Struktur der Tabelle aus?
Muss das ein automatisierter Prozess werden?

Im einfachsten Fall setzt du eine Query im SSMS ab und kopierst das Ergebnis in eine Datei.
Könnte dann je nach XML-Schema so aussehen:

SELECT [Column1], [Column2], ...
FROM [dbo.MyTable]
FOR XML PATH('Entry'), ROOT('Entries')

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Hallo,

ich versuche es alleine zu machen und passiert schon was, allerdings habe ich eine Frage.
Normalweise hatte ich bei XML Schema nur solche Felder Name, wie <v1:alternative> oder so was, und jetzt habe ich doppelte name:<commons:address1> . Ist das auch eine Name des Felders????

A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Hallo,

ich frage so ab:

SELECT name, adresse
from tabtest main
		FOR XML PATH('adresse1'), ROOT('externeadresse')

und bekomme ich , wie gewünscht:

<externeadresse>
  <adresse>
    <name>Al-Adudi Hospital</ name>
    < adresse1>Organisation</ adresse>
 </adresse>
</externeadresse>

Aber meine XML Schema soll so aussehen:, die felder address1 und address2 habe ich auch in der Tabelle, aber ich weiss es nicht, wie ich das abfragen soll, damit es so aussieht:


<externeadresse>
  <adresse>
    <name>Al-Adudi Hospital</name>
    < adresse1>Organisation</adresse1>
    <contactAdress>
             <commons:address1> test1 </commons:address1> 
              <commons:address2> test2 </commons:address2> 
    </contactAdress>
    </adresse1>
</externeadresse>

U
69 Beiträge seit 2019
vor 4 Jahren

Hallo Anna85,

ich würde es mal so versuchen:

USE MyDB;

WITH XMLNAMESPACES ('commons' as commons)
SELECT name,
adresse1,
adress1 as 'contactAdress/commons:adress1',
adress2 as 'contactAdress/commons:adress2'
FROM [dbo.MyTable]
FOR XML PATH('adresse'), ROOT('externeadresse')

Das liefert bei mir einen solchen output:

<externeadresse xmlns:commons="commons">
  <adresse>
    <name>a</name>
    <adresse1>b</adresse1>
    <contactAdress>
      <commons:adress1>e</commons:adress1>
      <commons:adress2>d</commons:adress2>
    </contactAdress>
  </adresse>
  <adresse>
    <name>f</name>
    <adresse1>g</adresse1>
    <contactAdress>
      <commons:adress1>h</commons:adress1>
      <commons:adress2>i</commons:adress2>
    </contactAdress>
  </adresse>
</externeadresse>

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
463 Beiträge seit 2009
vor 4 Jahren
  
SELECT name,  
adresse1,  
adress1 as 'contactAdress/commons:adress1',  
adress2 as 'contactAdress/commons:adress2'  
FROM [dbo.MyTable]  
FOR XML PATH('adresse'), ROOT('externeadresse')  

Und was machst du wenn es nur 1 Adresse gibt oder gar 3 oder 4? Du hast hier (normalerweise) eine 1:n Beziehung in der Datenbank, welche du hart auf 2 Einträge münzt.. Hier sind Fehler vorprogrammiert.

Des Weitern muss ich gestehen, dass ich es von Anna85 ein wenig unverschämt finde, wie Sie hier versucht das Forum als Codegenrator zu missbrauchen.

@Anna85: Ich würde dir empfehlen weniger auf Youtube Videos zur Lösung von einem Problem zu gehen und vielmehr ein gutes Buch in die Hand nehmen und dir die Grundlagen anzueignen damit du die Probleme selbst lösen kannst. Code kopieren welchen du nicht verstehts löst dein Problem nicht wirklich

U
69 Beiträge seit 2019
vor 4 Jahren

Hey Stefan,

in der Fragestellung ist explizit die Rede von einer Tabelle mit 5 Spalten.
Bei einer 1:n Beziehung würde ich auch nicht das erwarten:

   <contactAdress>
             <commons:address1> test1 </commons:address1> 
              <commons:address2> test2 </commons:address2> 
    </contactAdress>

sonder:

   <contactAdress>
             <commons:address> test1 </commons:address> 
              <commons:address> test2 </commons:address> 
    </contactAdress>

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
463 Beiträge seit 2009
vor 4 Jahren

Hey Urza,

deshalb habe ich auch normalerweise geschrieben - denn deine Lösung löst dem TE nur dieses Problem - für die Zukunft hat er das nächste Problem wenn er auf 1:n umstellt... Deswegen auch der Hinweis an den TE sich die Grundlagen anzueignen und nicht nur Code kopieren....

VG
Stefan

U
69 Beiträge seit 2019
vor 4 Jahren

Hey Stefan,

jede Lösung muss angepasst werden wenn auf 1:N umgestellt wird. Entweder muss der Quellcode geändert werden oder in meinem Lösungsvorschlag noch ein subselect eingefügt werden.

Ich denke auf das können wir uns einigen 😉:

Deswegen auch der Hinweis an den TE sich die Grundlagen anzueignen und nicht nur Code kopieren....

VG
Matthias

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Guten Morgen,

vielen lieben Dank, ich habe zu meine irig angepasst und es funktioniert. Das ist ja toll!!!

In meinem orig Schema, ist noch so was: v1 :


<v1:externeadresse>
  <v1:adresse>
    <v1:name>Al-Adudi Hospital</v1:name>
    < v1:adresse1>Organisation</v1:adresse1>
    <v1:contactAdress>
             <commons:address1> test1 </commons:address1> 
              <commons:address2> test2 </commons:address2> 
    </v1:contactAdress>
    </v1:adresse1>
</v1:externeadresse>


Ich habe eingfach versucht in dem Code, so zu schreiben:


Use ds-org;
WITH XMLNAMESPACES ('commons' as commons)
SELECT name,
adresse1,
adress1 as 'v1:contactAdress/commons:adress1',
adress2 as 'vi:contactAdress/commons:adress2'
FROM [organisationen]
FOR XML PATH('adresse'), ROOT('externeadresse')

Aber bekomme ich Fehler, wie klann ich das v1 definieren?

Lieben Dank!

A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Das obere Beitrag habe ich gelöst, danke!

A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Ich habe letzte Schwerpunkt:

ein Punkt in meinem Schema ist noch so definiert, erste Zeile:


<v1:externeadresse id="external_org_id1" type ="organ">
  <v1:adresse>
    <v1:name>Al-Adudi Hospital</v1:name>
    < v1:adresse1>Organisation</v1:adresse1>
    <v1:contactAdress>
             <commons:address1> test1 </commons:address1> 
              <commons:address2> test2 </commons:address2> 
    </v1:contactAdress>
    </v1:adresse1>
</v1:externeadresse>



Wie kann ich es für meine Schema das Punkt abfragen?

Und Zweite Frage hätte ich, ist das id in der erste Zeile eine Zahl, die aus der Tabelle zurückkommen soll?
Ich habe noch 2 Spalten in meine Tabelle, aber ich weiss es nicht, ob das die Werte aus der TAbelle sein sollen???

Liebe Grüße!

U
69 Beiträge seit 2019
vor 4 Jahren

Hallo Anna85,

Und Zweite Frage hätte ich, ist das id in der erste Zeile eine Zahl, die aus der Tabelle zurückkommen soll?
Ich habe noch 2 Spalten in meine Tabelle, aber ich weiss es nicht, ob das die Werte aus der TAbelle sein sollen???

Diese beiden Fragen kann ich dir auch nicht beantworten.

Zu dem ersten Punkt:
Ein Attribut (also "id" und "type") zu erzeugen geht bspw. so:

SELECT [Column1] as '@id' .....

Das müsstest du noch hiermit kombinieren: Zurückgeben von Ergebnissen innerer FOR XML-Abfragen als XML-Typinstanzen an äußere Abfragen
Dein bisheriger code wird dabei größtenteils die innere SELECT-Abfrage sein.
<v1:externeadresse> und die beiden Werte für "id" und "type" gehören in den äußeren Bereich der Abfrage.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
463 Beiträge seit 2009
vor 4 Jahren

@Anna85:

Nochmals, glaubst du nicht, dass es einfacher ist, wenn du dir erst einmal die absoluten Basics aneignest - dein Try and Error Prinzip wird dir nicht weiterhelfen. Du kopiert Code, den du nicht verstehst - dies ist nicht zielführend!

A
Anna85 Themenstarter:in
59 Beiträge seit 2019
vor 4 Jahren

Hi, hast du volkomm Recht, ich kann zu Weiterbildung für eine Woche gehen, der Kurs startet im September, auch im Juli.
Leider ich habe Zeit bis nächste Woche Di, deshalb versuche ich das auf Basis von der Info, was ich hier bekomme meine Daten in der Schema zu bekommen.

Viele Grüße