XML [Geschlossen]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

XML [Geschlossen]

Beitrag von Jan »

Moin,

Xbase++ hat in ja die verschiedenen XML-Funktionen eingebaut. Ich werd aber aus der Doku nicht so recht schlau. Wie mache ich das damit, einen XML-String zu empfangen, und dann darin bestimmte Werte auszulesen? Ich muß doch irgendwie die Tags ansprechen können, und das auch, wenn die mehrerer Ebenen tiefer liegen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XML

Beitrag von georg »

Hallo, Jan -


Du musst Dich durch den XML-Baum hinabarbeiten zu dem Tag, das Dich interessiert. Du startest mit dem Root-Knoten und gehst die daran hängenden Knoten durch, und so weiter.

Es gab mal ein White Paper von Alaska zu dem Thema, aber ich habe XML bisher recht erfolgreich verdrängen können.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
DelUser01

Re: XML

Beitrag von DelUser01 »

Hallo Jan

zum Thema ein Hilfsmittel für den "Durchblick" innerhalb von XML-Dateien:
Microsoft XML-Notepad: http://www.microsoft.com/en-us/download ... px?id=7973
(kennst Du vielleicht schon...).
Nimmt Dir allerdings keine Programmierarbeit ab :(
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Vielleicht habe ich mich falsch ausgedrückt.

Ich erhalte aus dem Web einen String, der XML ist. Den muß ich auseinander bröseln. Alaska hat ein Dutzend XML-Funktionen in der Hilfe stehen. Aber kein Sample, und die Hilfetexte sind reichlich rudimentär.

Ich möchte einfach nur wissen wie ich es schaffe, bestimmte Daten aus dem XML-String auszulesen. Mir ist klar, wie eine XML aufgebaut ist. Ich muß den String nur lesen, nichts schreiben. Ich muß nur finden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XML

Beitrag von georg »

Hallo, Jan -


wenn Dir nur an einem bestimmten Code-Abschnitt geht, dessen Tags Du kennst - warum verwendest Du keine Regular Expressions?

Wenn Du <Kundenauftrag>284759</Kundenauftrag> suchst, wäre z.B.

Code: Alles auswählen

<Kundenauftrag>(.+?)<
ein fantastisches Pattern, um das zu lokalisieren. Wenn Du mehr erzählst, kann man Dir auch mehr helfen (frei nach Jimmy).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Georg,

noch einmal: Alaska bietet einen ganzen Schwing XML-Funktionen an. Mit denen man anscheinend genau das machen kann was ich brauche. Ich versteh nur die Funktionen nicht, weil die Doku rudimentär ist. Mich interessiert ob irgend jemand das schon geknackt hat und mir kurz aufführen mag, welche Funktionen dafür wie verwendet werden.

Klar geht mit regular Expressions eine Menge. Aber warum soll ich den steinigen Weg gehen und alles noch einmal erfinden, wenn Alaska das alles schon in passende Funktionen gegossen hat?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: XML

Beitrag von DelUser01 »

Hallo Jan

Du hast Dich nicht falsch ausgedrückt.
Aber wie Georg schon geschrieben hat, Du musst Deinen "String" nach den Anfang/Ende Tags zerlegen ( <TagID> bla bla </TagID> ).
Die sind je nach Anwendung entsprechend verschachtelt.
Du sprichst von einem "String" und nicht von einem File. Willst/musst Du einem XML-Stream permanent zerlegen?

Wenn ich das richtig sehe kann jeder für seine Anwendung die XML-Tags, die Verschachtelung usw. selbst festlegen (siehe SEPA). Du müsstest wissen was in Deinem XML-String vorkommen kann, wie der Aufbau ist oder mindestens nach was für Tags Du suchen sollst/musst.
DelUser01

Re: XML

Beitrag von DelUser01 »

OK - Du suchst einfach Funktionen welche Dir Dein XML-File zerlegen helfen...
DelUser01

Re: XML

Beitrag von DelUser01 »

Jan hat geschrieben:...Alaska bietet einen ganzen Schwung XML-Funktionen an.
wo hast Du die gefunden?
In der Version 2?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Hallo Roland,

richtig, in der 2.0. Wobei es die Funktionen schon in der 1.9 gegeben haben muß, weil es in den Samples was entsprechendes gibt.
XML.jpg
XML.jpg (23.92 KiB) 10837 mal betrachtet
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: XML

Beitrag von DelUser01 »

Hallo Jan

gefunden - hast Recht, gibt es schon in der 1.9 Subscr.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XML

Beitrag von georg »

Hallo, Jan -


hast Du Dir das mal angesehen: ftp://ftp.alaska-software.com/documents/XML1.PDF

Aufgrund dieses Papiers habe ich vor Jahren mal einen Artikel für die SDT geschrieben.

Möglichkeit 1: arbeite das WhitePaper durch und zerlege den XML-Baum entsprechend;
Möglichkeit 2: suche Dir das entsprechende Tag aus dem String raus mittels At() oder RegExp()

Wenn Du XML etwas "plastischer" sehen willst, empfehle ich Dir XMLSpy: http://www.altova.com/xmlspy.html
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XML

Beitrag von brandelh »

Die 1.9 er Hilfe war hier ASXML.HLP ...

Georg wollte dir zeigen, wie man ein TAG findet ohne den Baum durchzuarbeiten,
die Funktionen scheinen wohl alle Tags durchlaufen zu müssen ?

Die Frage ist doch, was du an Daten erwartest.

1. Öffnen
XMLDocOpenFile() öffnet eine Datei ähnlich wie fopen() ... gibt es einen Handle zurück.
XMLDocOpenString() nutzt statt der Datei gleich einen String ... gibt es einen Handle zurück

2. ROOT lesen (kann es mehrere in einer Datei geben ?)

XMLDocGetRootTag()

3. Tags auslesen ...
XMLGetChild() scheint eine Art von Suche zu sein, wobei ich nicht weiß wie er doppelte Sätze verarbeitet.
XMLGetChildren( <nTagHandle>, <cChildTagName> ) das ganze auf alle Kindeinträge
XMLGetTag( <nTagHandle>, @<aTagMember> ) in einer Schleife nutzen
XMLDocProcess() - Execute action code blocks for all tags ... die mit XMLDocSetAction() gesetzt wurden.
du könntest also einen codeblock setzen, der genau deiner Bedingung entspricht.

4. Schließen

XMLDocClose() - Close an XML document - wichtig um internen Speicher freizugeben

Ich selbst habe das noch nicht genutzt, aber es scheint mir doch nicht so fremd zu sein ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Hubert,

in Deinem Beitrag gibt es mir zu viele "scheint"s. Ich hab den Thread hier ja nicht aus Jux und Dollerei eröffnet. Natürlich habe ich in der Hilfe gelesen und auch mal rumprobiert. Und natürlich auch das ASXML-Sample durchgearbeitet. Aber das hat (mir) nichts gebracht. Und deshalb hab ich hier mal gefragt. Weil ich Antworten brauche.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XML

Beitrag von georg »

Hallo, Jan -


grob vereinfacht, hat eine XML-Datei etwa diesen Aufbau:

Code: Alles auswählen

<root>
<kunde-1>
  <name>Peter Müller</name>
  <telefon>12345</telefon>
</kunde-1>
<kunde-2>
  <name>Peter Maier</name>
  <telefon>56789>/telefon>
</kunde-2>
</root>
Wenn Du aus dieser XML-Datei die Kundennamen extrahieren musst, dann musst Du in einer Schleife nach <name> suchen, die Begrenzung </name> finden und den Wert speichern, der dazwischen steht. Das geht mit At() oder RegExp() am schnellsten (aber nicht: am saubersten).

Wenn Du mit ASXML arbeiten willst, fängst Du bei <root> an und liest die darunter liegenden Knoten. Du findest zuerst <kunde-1> und gehst die Knoten durch, die darunter liegen. Wirst Du dort fündig, d.h. Du findest einen Knoten <name>, dann speicherst Du den Wert. Anschliessend gehst Du eine Ebene hoch und prüfst den nächsten Knoten. Hast Du alle Knoten geprüft, gehst Du eine Ebene hoch und prüfst dort die weiteren Knoten.

Was an diesem Verfahren ist unklar oder "scheint's"?

Da XML extrem flexibel in der Darstellung ist, kann ich Dir ohne ein Beispiel der Dir vorliegenden XML-Datei auch nicht viel mehr sagen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Georg,

Danke für Deine Bemühungen. Aber wie ich oben schon schrieb - ich weiß durchaus, wie eine XML aufgebaut ist. Und es geht auch nicht darum, das Du mir eine Musterdatei aufbröselst.

Ich will einfach nur wissen, wie ich die ja vorhandenen Xbase++-Funktionen dazu benutze. Damit ich das alles eben nicht von Hand machen muß. Sondern eleganter und mit weniger Arbeit. Man muß doch das Rad nicht noch einmal erfinden, wenn es denn doch schon da ist ...

Die "scheint" kamen in Huberts Beitrag vor, und darauf hatte ich mich bezogen. Denn nicht XML ist mir unklar, sondern die Xbase++-Funktionen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XML

Beitrag von brandelh »

Jan hat geschrieben:Hubert,
in Deinem Beitrag gibt es mir zu viele "scheint"s. Ich hab den Thread hier ja nicht aus Jux und Dollerei eröffnet.
Natürlich habe ich in der Hilfe gelesen und auch mal rumprobiert. Und natürlich auch das ASXML-Sample durchgearbeitet.
Aber das hat (mir) nichts gebracht. Und deshalb hab ich hier mal gefragt. Weil ich Antworten brauche.
Jan
Hi Jan,

wenn dir jemand vorher mit genau dem geantwortet hätte das du erwartest, hätte ich dir nicht geantwortet.
Aber ich werde dich in Zukunft mit meinen "Tipps" verschonen, ehrlich gesagt finde ich die Antwort schon unverschämt.
Ich kann ja nicht ahnen was du schon alles gemacht hast und ehrlich gesagt finde ich die Beschreibung so umständlich nicht.
Ich hatte bisher halt keinen Bedarf, aber keine Angst das wars auch schon. :roll:
Gruß
Hubert
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

Re: XML

Beitrag von Hans Zethofer »

Code: Alles auswählen

<Kundenauftrag>(.+?)<
Wie schaut so eine Routine mit diesem Pattern genau aus?

XML mit fread lesen und in einer Do while Schleife oder mit einem Fornext?

kannst du hier ein kurzes Beispiel einstellen?
_____________
lg
Hans
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XML

Beitrag von georg »

Hallo, Hans -


ich verweise da erst mal auf meinen Artikel in der Wissensbasis zum Thema Regular Expressions (aber den kennst Du ja schon). So aus der Feder heraus, nicht compiliert etc:

Code: Alles auswählen

   nHandle := fOpen(cXMLFile)
   IF nHandle < 1
      RETU(.F.)
   ENDIF
   nSize := fSize(nHandle)
   cLine := Space(nSize)
   fRead(nHandle, @cLine, nSize)
   fClose(nHandle)
   nStart := 1
   nOptions := PCRE_CASELESS + PCRE_MULTILINE + PCRE_DOTALL
   cPattern := '<Kundenauftrag>(.+?)<'
   oReg := RegExp():new(cPattern, nOptions)
   nResult := oReg:exec(cLine, nStart)
   WHILE nResult > 0
      aSet := oReg:result(1)
      nStart := aSet[1] + aSet[2]
      aSet := oReg:result(2)
      cName := Substr(cLine, aSet[1], aSet[2])
      nResult := oReg:exec(cLine, nStart)
   END
Zur Erklärung:

Code: Alles auswählen

      aSet := oReg:result(1)
      nStart := aSet[1] + aSet[2]
Das ist der Match, den die RegExp insgesamt zurückgibt. Es ist klar, dass die Suche dahinter weitergehen muss, daher setze ich nStart auf aSet[1] (= Beginn des Match) + aSet[2] (= Länge des Match)

Das Pattern erzeugt zwei Matches, von denen der zweite Match der Begriff ist, der zwischen den Tags steht, daher verwende ich oReg:result(2).

Sollte so eigentlich funktionieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
manni1729
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 30
Registriert: Mi, 04. Jun 2008 14:18
Wohnort: Nordhessen

Re: XML

Beitrag von manni1729 »

Ich verwende eine Klasse von Phil Ide

xmlparser.prg

Code: Alles auswählen

 oParser := XmlParser():new(cXml)
            oXml := oParser:parse()

            if valtype(oTag := oXml:findChildFromName("status",1)) == "O"
                cStatus := oTag:content
                IF valtype(cStatus) == "C"
                    IF cStatus == "1"
                        lRet := .T.
                    ENDIF
                ENDIF
            endif
Ich kann Dir die Klasse gerne zusenden :D
Gruß Manni
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XML

Beitrag von Jan »

Hallo Leute,

ich schließe den Thread mal wieder. Entweder ich trete den Leuten hier auf den Schlips, oder ich bekomme Antworten auf Fragen, die ich nicht stelle. Irgendwie geht das hier komplett daneben.

Tut mir leid.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: XML [Geschlossen]

Beitrag von Wolfgang Ciriack »

Das liegt dann jedoch eindeutig an Dir :)
Du schreibst, dass du das Rad nicht neu erfinden willst, beharrst aber auch die XBase++ - Funktionen.
Das beisst sich aber scheinbar, da viele schon mit XML arbeiten aber nicht mit den (teilweise neuen und undokumentierten) XBase-Funktionen. Fertige Beispiele wirst da dann wohl nur von Alaska selbst erwarten können.
Viele Grüße
Wolfgang
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: XML [Geschlossen]

Beitrag von UliTs »

Ein typischer Jan Thread: ich verrate nicht was ich will, erwarte aber exakte Antworten, die sich nur darauf beziehen was ich will. 8) und wenn ich nicht bekomme was ich will, bin ich beleidigt. :(
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten