Discussion:
vfp 9 sp2 und xml
(zu alt für eine Antwort)
Manfred Paul
2010-04-19 12:27:06 UTC
Permalink
hallo füchse,

bei uns (österreich *g*) gibt es jetzt neu eine ÖNORM A2063 - datenaustausch
z.b. zwischen architekt und ausführender firma - angebot/auftrag. bisher war
diese norm als txt mit fester satzlänge ausgelegt - zum einlesen und
ausgeben ja kein problem.

die neue norm ist jetzt "natürlich" ein XML format. hab schon versucht die
datei mit xmltocursor() zu öffen - bekomm aber nur fehlermeldungen - nehme
mal an, der aufbau der xml ist zu aufwending für den fuchs.

hat jemand ein paar tipps, denkanstösse, links, tools, ... wie und wo ich da
anfangen könnte um so eine datei auszulesen, die werte in ner DBF zu
speichern - und wenns möglich ist - auch wieder ne XML erstellen und mit den
werten einer dbf füllen (es geht da um dinge wie leistungspositionen,
beschreibungen , texte, mengen, preise, ...).

danke vielmals schon im voraus für hilfe.
lg
manfred paul
Matthias Kahlert
2010-04-19 12:36:21 UTC
Permalink
Post by Manfred Paul
hat jemand ein paar tipps, denkanstösse, links, tools, ... wie und wo
ich da anfangen könnte um so eine datei auszulesen, die werte in ner DBF
zu speichern - und wenns möglich ist - auch wieder ne XML erstellen und
mit den werten einer dbf füllen (es geht da um dinge wie
leistungspositionen, beschreibungen , texte, mengen, preise, ...).
Notfalls kannst Du Dir die XML auch mit STREXTRACT(lcXML, "<tag>",
"</tag>") zerlegen und zerstückeln und so einlesen.

Wieder ausgeben geht notfalls auch, indem Du einfach alles als String
zusammenbaust.

Sowas wie XMLToCursor() hat oftmals Problemchen, wenn das XML nicht ganz
sauber ist, etwa fehlende Anführungszeichen, etc.
--
Matthias
tom knauf
2010-04-19 12:40:08 UTC
Permalink
Moin, moin

auch wenn es altmodisch ist :

wir machen das bei verschiedenen Anwendungen "manuell" mit strextract(),
strconv(xxx, 11), ...

ein bisschen was Generelles (Sonderzeichen, UTF8 Konvertierung ) :
http://de.selfhtml.org/xml/regeln/zeichen.htm
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
http://de.selfhtml.org/inter/unicode.htm
http://www.utf8-zeichentabelle.de/

nützlich :
PSPAD (free) und/oder XML Notepad 2007 (MS, free)

Einer der Fallstricke bei manuellem Zusammenbau ist die BOM (ByteOrderMark,
siehe wiki, selfhtml,...) ,
besser mit einem Hexeditor in der Quelle checken.

HTH
Tom
Post by Manfred Paul
hallo füchse,
bei uns (österreich *g*) gibt es jetzt neu eine ÖNORM A2063 -
datenaustausch z.b. zwischen architekt und ausführender firma -
angebot/auftrag. bisher war diese norm als txt mit fester satzlänge
ausgelegt - zum einlesen und ausgeben ja kein problem.
die neue norm ist jetzt "natürlich" ein XML format. hab schon versucht die
datei mit xmltocursor() zu öffen - bekomm aber nur fehlermeldungen - nehme
mal an, der aufbau der xml ist zu aufwending für den fuchs.
hat jemand ein paar tipps, denkanstösse, links, tools, ... wie und wo ich
da anfangen könnte um so eine datei auszulesen, die werte in ner DBF zu
speichern - und wenns möglich ist - auch wieder ne XML erstellen und mit
den werten einer dbf füllen (es geht da um dinge wie leistungspositionen,
beschreibungen , texte, mengen, preise, ...).
danke vielmals schon im voraus für hilfe.
lg
manfred paul
Manfred Paul
2010-04-20 07:33:13 UTC
Permalink
vielen dank für die hilfe!

einlesen und verarbeiten geht mit strextract() und strconv() ganz ok -
einiges an arbeit aber es geht ganz gut.

das erneute erstellen einer xml nachdem die daten verändert wurden ist aber
ein kleiner hammer *g* na mal sehen wie ich da vorgehe. event. teile der xml
zwischenspeichern und dann meine geänderten daten anfügen.

lg
manfred paul
tom knauf
2010-04-20 08:00:42 UTC
Permalink
Hallo,

oder strtran(...Strconv()) :-), ist aber in jedem Fall eine Menge Arbeit.

Grüße
tom
Post by Manfred Paul
vielen dank für die hilfe!
einlesen und verarbeiten geht mit strextract() und strconv() ganz ok -
einiges an arbeit aber es geht ganz gut.
das erneute erstellen einer xml nachdem die daten verändert wurden ist
aber ein kleiner hammer *g* na mal sehen wie ich da vorgehe. event. teile
der xml zwischenspeichern und dann meine geänderten daten anfügen.
lg
manfred paul
Aragorn
2010-04-20 08:05:15 UTC
Permalink
Hallo Manfred,

alternativ kannst Du es auch mit dem Microsoft XML Parser probieren.
Einige Infos dazu findest Du im FoxWiki
http://fox.wikis.com/wc.dll?Wiki~MsXML~SoftwareEng (auch wenn nicht mehr
ganz up-to-date).

Vielleicht etwas mehr Aufwand in der Bearbeitung, aber wenn das XML
syntaktisch korrekt ist, geht das Lesen und Schreiben ganz einfach.

Hoffe das hilft!

Gruß,
Ari
Post by Manfred Paul
hallo füchse,
bei uns (österreich *g*) gibt es jetzt neu eine ÖNORM A2063 -
datenaustausch z.b. zwischen architekt und ausführender firma -
angebot/auftrag. bisher war diese norm als txt mit fester satzlänge
ausgelegt - zum einlesen und ausgeben ja kein problem.
die neue norm ist jetzt "natürlich" ein XML format. hab schon versucht
die datei mit xmltocursor() zu öffen - bekomm aber nur fehlermeldungen -
nehme mal an, der aufbau der xml ist zu aufwending für den fuchs.
hat jemand ein paar tipps, denkanstösse, links, tools, ... wie und wo
ich da anfangen könnte um so eine datei auszulesen, die werte in ner DBF
zu speichern - und wenns möglich ist - auch wieder ne XML erstellen und
mit den werten einer dbf füllen (es geht da um dinge wie
leistungspositionen, beschreibungen , texte, mengen, preise, ...).
danke vielmals schon im voraus für hilfe.
lg
manfred paul
Manfred Paul
2010-04-20 10:53:21 UTC
Permalink
DANKE!

ja das scheint machbar zu sein.
etwas aufwendig den "baum" zu durchschreiten - aber geht super zum auslesen
und auch ändern.
also damit kann (muss *g*) ich leben.
somit kann ich die daten rausholen in ne dbf geben - dort ändern und dann
wieder xml durchlaufen - Node suchen und wert ändern.

gibt es gröbere probleme zu erwarten bezüglich der unterschiedlichen
MSXML-versionen?
ich hab scheinbar eine neuere als vers. 6 drauf.
es reicht wohl wenn ich bein einem pc eine sehr alte version oben ist, eine
neue version zu installieren.
wenn in nen halben jah ne noch neuere version rauskommt wird das ja
hoffentlich nicht meinen code zerschießen?

arbeite mit createobject('msxml.domdocument')

lg
manfred paul
Jürgen Wondzinski
2010-04-21 09:27:50 UTC
Permalink
Hallo Manfred,

der XmlToCursor (und das Gegenstück CursorToXml) sind, wie der Name schon
sagt, spezialisierte Routinen, um genau einen Cursor in ein XML hin- und
herzuwandeln. Also ist dies nicht geeignet eine verschachtelte Struktur
(oder in XBase-Speak eine Master-Child Relation) abbilden zu können.

Wenn du verschachtelte (relationierte) Daten hast, dann ist der XMLAdapter
mitsamt den XMLTable und XMLField - Klassen der richtige Ansatz. Der
XMLAdapter wiederum kapselt den MS XMLParser und macht ihn VFP-tauglich
(Kein Grund also, den MS Parser direkt anzusprechen, ausser man ist
Masochist)

Zum XMLAdapter gibts auch vieles zum Lesen (Guggelst du nach "xmladapter
builder vfp sample") und auch entsprechende Builder zum Runterladen.

Wenn du händisch an die Sache rangehst, kannst du auch das Gesamt-XML mit
StrExtract() in die einzelnen Teil-XMLs zerlegen und dann mit XmlToCursor
diese wieder in Tabellen überführen.
--
wOOdy
Visual FoxPro Technologieberater
Microsoft "Most Valuable Professional" 1996 bis 2009



"*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
..·`.Visual FoxPro: It's magic !
(¸.·``··*
Manfred Paul
2010-04-23 08:01:36 UTC
Permalink
danke jürgen für den tipp!

aber es klappt irgendwie nicht *g*
mit dem xmlparser komm ich an die daten ran - mit dem xmladapter nicht?

folgender code:
cFile = "C:\Entwickl\önorm\Test-LV_Alucobonfassade.onlv"
adapter = CREATEOBJECT("XMLAdapter")
lcload=adapter.LoadXML(cFile,.T.)
***lcload gitb.T.***
lctablescount=adapter.tables.count
***lctablescount gibt 0 ???***
adapter.Tables(1).ToCursor()
***fehler index or expression does not match ...***

wie gesamt am xml-file sollte es nicht liegen - kanns mit dem xmlnotepad
öffnen und mit dem xmlparser durchlaufen.
was mach ich denn falsch?

danke und schönes wochenende!
manfred paul
Olaf Doschke
2010-05-03 13:48:46 UTC
Permalink
Post by Manfred Paul
wie gesamt am xml-file sollte es nicht liegen - kanns mit dem xmlnotepad
öffnen und mit dem xmlparser durchlaufen.
was mach ich denn falsch?
Wenn der XMLAdapter 0 Tabellen zählt, dann ist die XML-Struktur eben auch
nicht so kanonisch aufgebaut, daß der XMLAdapter daraus Tabellen erkennt,
die er ausgeben könnte, ergo scheitert auch ToCursor.

Es kann sein, daß trotzdem z.B. ein oder mehrere innerer XML-Kernstücke
zwischen einzelnen Tags per XML-Adapter auslesbar sind, auch der XMLAdapter
hat seine Grenzen in der Tabellenstrukturerkennung. Du kannst im TreeView
Tab des XmlNotepad das XML zusammenklappen und dann Tags/Knoten aufklappen.
Schau Dir mal heraus, was so die obersten Tagknoten sind und schneide das
XML zwischen diesen Tags per STREXTRACT heraus, um es dann als neues XML
wiederum einem XML-Adapter oder XMLToCursor zu fressen zu geben. Nach dem
Motto teile und herrsche. Nur weil die XMLTools am Gesamt-XML versagen muß
man nicht gleich alles komplett selbst parsen, schau Dich einfach mal um,
was Du da an großen Abschnitten findest.

XML ist ja auch nicht nur Transportvehikel für Tabellen. Auch wenn in dem
besagten XML Datenaustauschformat sicherlich tabellenartiges XML enthalten
sein wird, da das ursprüngliche Format soweit ich Dich verstehe eine einzige
Tabelle mit fester Satzlänge war. Aber es kann sowohl XMLTOCursor als auch
den XMLAdapter schon stören, wenn eine Tag-Klammer-Ebene den eigentlichen
Inhalt umschließt oder im Kopfbereich des XML diverse Einzelwerte in
Einzeltags enthalten sind, wodurch dieser Kopfteil eher einer Konfiguration
entspricht. Die Daten können auch perfiderweise eher in Tagattributen
enthalten sein als zwischen den Tags.

Du wirst nicht drum herum kommen, Dich etwas ins XML hineinzuknien. Man
kommt aber recht weit ohne tiefere Kenntnisse. Es gilt das
"Wald-vor-lauter-Bäumen-nicht-erkennen" Prinzip. Versuche nicht das XML in
der Tiefe und den Details zu verstehen, sondern hangele Dich an den
äußersten Knoten entlang um die ganz grobe Struktur zu erkennen, dann hast
Du die Chance die inneren XML-Abschnitte doch noch per XMLToCursor oder
XMLAdapter umzuwandeln und mußt Dich mit dem selbst Parsen nur um das grobe
außen herum kümmern.

Wenn der XMLAdapter in einem (Teilstück) XML Tabellen erkennt und nach dem
LoadXML der Tabellencount>0 ist, dann funktioniert z.B.

For Each loXMLTable in loXMLAdapter.Tables
loXMLTable.ToCursor()
EndFor

Aber daran siehst Du auch schon, wie wenig das ToCursor ohne XMLTables
Collection hilft.

Tschüß, Olaf.

Loading...