Anmelden

View Full Version : XML aus MQ parsen



Seiten : [1] 2

RogerM
29-12-05, 14:42
Hallo Leute,

ich habe bei uns in der Firma folgende Aufgabe zu lösen.

<O:p</O:p
Ich erhalte via Message Queue Messages die XML beinhalten.

Nun soll ich diese XML mit den API's, die im QXML4PR520/ 'XML RPG Parser 5,2 API Interface' zur Verfügung stehen, parsen und in DB2 stellen.

Für den Umgang mit diesen API's stehen von der IBM einige kleine Beispielprogramme zur Verfügung, die jedoch immer auf XML-Files zugreifen, die im IFS abgelegt sind.



Code aus dem Beispielprogramm

ALLOC 10 GetTagOpt
ALLOC 256 XmlFile
ALLOC 256 strgbuf
Move input to string areas <O:p></O:p>
EVAL %str(XmlFile:256) = %TRIMR(XmlFile)
EVAL %str(GetTagOpt:256)='*'<O:p</O:p
Initialize XML environement, provide pointer to DOM exception area
CALLP QxmlInit(ENVDATA)
Create a Parser object, set validation options and parse
EVAL DomParse = QxmlXercesDOMParser_new(PRSDATA)
Validate document arg - set to 1 if DTD available <O:p</O:p
and you want to use it
CALLP QxmlXercesDOMParser_setValidationScheme
(DomParse : 0)
CALLP QxmlXercesDOMParser_parse_SystemId(DomParse:
XmlFile*:Qxml_CCSID37:0)
Get parse document
EVAL DomDoc = QxmlXercesDOMParser_getDocument
(DomParse)<O:p</O:p
Get a node list of all ('*') elements by tag name
EVAL DomNodeList = QxmlDOMDocument_getElementsByTagName
(DomDoc:GetTagOpt:Qxml_CHARSTR:1)

Ende Code<O:p</O:p

Mein Problem liegt nun darin, dass ich nicht weiss wie ich die XML aus der Message in den Parser bringe. Jemand gab mir den Tipp ich soll es anstelle des API's QxmlXercesDOMParser_parse_SysemId( ) zum parsen mit den API's

<O:p</O:p
QxmlMemBufInputSource_new( )
QXmlXercesDOMParser_parse_InputSource( )<O:p</O:p

<O:p</O:p
probieren. Hab ich gemacht, das funktioniert bei mir nicht, da spätestens beim Erstellen der DomNodeList das Programm mit der Meldung 'Zeiger nicht gesetzt' stoppt.

Nun die prinzipielle Frage: Bin ich mit diesen API's auf dem richtigen Weg oder liege ich völlig falsch? Bin um jeden Tipp dankbar.

Roger M.

RobertMack
29-12-05, 16:44
Hallo Roger,

was macht denn der MQGET mit den Messages?

Du könntest diese ja zunächst als .xml im IFS abstellen
(bzw. zeilenweise sammeln und dann als Datei ins IFS kopieren)

Gruß,
Robert

RogerM
30-12-05, 15:07
Hallo Robert
Besten Dank für den Tipp. Auf die Idee bin ich auch schon gekommen,
nur würde ich mir den Umweg lieber ersparen.

Ich hab es auch schon ausprobiert und von mir in die Message Queue gestellte
Testdaten ausgelesen, die Testdaten als .mxl in das IFS gestellt und versucht das ganze
zu parsen. Das Programm stürzt, sobald die DOMNodeList erstellt werden sollte,
wobei ich hier den leisen Verdacht habe, das es an der Qualität meiner Testdaten
liegt.

Gruss, Roger

RobertMack
30-12-05, 15:22
oder an der Qualität der .dtd (Übereinstimmung?)

Versuche mal, die Datei aus dem IFS mit dem Explorer zu öffnen.

Gruß,
Robert

RogerM
30-12-05, 15:36
Die Daten, mit denen ich momentan am probieren bin, sehen in etwa
so aus: (Bei Kopieren ins Forum gehen einige Zeichen verloren)

<?xml version="1.0" ?>
xml version ="1.0"
<Order id="123" receiveDate="2003-06-20">
<Item id="123XML4C" price="250.00">XML4C</< font>Item>
<Item id="456eRPG" price="400.00">eRPG</< font>Item>
<Item id="789WDSc" price="0.50">WDSc 5</< font>Item>
<Payment type="CreditCard">
<CreditCard type="VISA" expDate="2003-10" number="1234123412341234" />
Payment>
Order>

und die kann ich im IFS mit dem Browser und mit dem XML Spy anschauen.


Gruss, Roger

RobertMack
30-12-05, 15:52
wieviel genau geht denn da verloren?

M.E. müsste das etwa so aussehen:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DataSet SYSTEM "deine.dtd">
<Data Set>

<Order id>123</Order id>
<receiveDate>2003-06-20</receiveDate>
<Item id>123XML4C</Item id>
u.s.w.

</Data Set>

RogerM
30-12-05, 16:12
nicht viel: die Fragezeichen vor und hinter der xml-version und
die Slashes vor payment und order.

Mit Daten wie aus deinem Beispiel hab ichs auch schon probiert
(also inkl. Encoding und DTD)

Die DTD hab ich mal weggelassen, weil ich zum üben das XML-File
nicht unbedingt validieren muss und weil das ! vor dem DOCType
beim schreiben des XML in die IFS falsch umgesetzt wird (als Pipe)

angelone
02-01-06, 15:38
du bist 100% auf dem richtigen weg.
wo sagter denn dass n pointer nicht gesetzt sei?

ich würd aber sagen du schmeisst den ibm parser weg
und benutzt expat.
ders flotter und funzt besser.

der ibm parser war mir immer zu unfertig und hatte fehler die sich niemand erklären konnt...

Fuerchau
02-01-06, 18:15
Du musst unterscheiden zwischen Nodes und Attributen.
"Item" ist ein Node mit den Attributen "Id" und "Price".
"Order" ist ein Node mit den Attributen "Id" und "receiveDate".

Du musst beim Parsen schon genau den Aufbau abfragen, ob du einen Node und den Wert dazu oder einen Node mit Attributen hast.

RogerM
04-01-06, 16:28
Besten Dank an alle für euren Input.

Ich habe bei uns in der Fa. jemanden gefunden, der mir
weiterhelfen kann (nächste Woche, wenn er denn aus
dem Urlaub zurück ist).. und wenn er's nicht kann, bin
ich sofort wieder hier im Forum..

Nochmals vielen Dank..

Roger