[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2005
    Beiträge
    6

    XML aus MQ parsen

    Hallo Leute,

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


    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 >>
    EVAL %str(XmlFile:256) = %TRIMR(XmlFile)
    EVAL %str(GetTagOpt:256)='*'
    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
    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)
    Get a node list of all ('*') elements by tag name
    EVAL DomNodeList = QxmlDOMDocument_getElementsByTagName
    (DomDoc:GetTagOpt:Qxml_CHARSTR:1)

    Ende Code

    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


    QxmlMemBufInputSource_new( )
    QXmlXercesDOMParser_parse_InputSource( )


    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.

  2. #2
    Registriert seit
    Jan 2003
    Beiträge
    751
    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

  3. #3
    Registriert seit
    Dec 2005
    Beiträge
    6
    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

  4. #4
    Registriert seit
    Jan 2003
    Beiträge
    751
    oder an der Qualität der .dtd (Übereinstimmung?)

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

    Gruß,
    Robert

  5. #5
    Registriert seit
    Dec 2005
    Beiträge
    6
    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"
    <Order id="123" receiveDate="2003-06-20">
    <Item id="123XML4C" price="250.00">XML4CItem>
    <Item id="456eRPG" price="400.00">eRPGItem>
    <Item id="789WDSc" price="0.50">WDSc 5Item>
    <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

  6. #6
    Registriert seit
    Jan 2003
    Beiträge
    751
    wieviel genau geht denn da verloren?

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

    PHP-Code:
    <?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>

  7. #7
    Registriert seit
    Dec 2005
    Beiträge
    6
    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)

  8. #8
    Registriert seit
    Mar 2005
    Beiträge
    148
    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...
    Gruß
    Martin

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.273
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Dec 2005
    Beiträge
    6
    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

  11. #11
    Registriert seit
    Dec 2005
    Beiträge
    6
    Hallo allerseits,

    nur für die die's interessiert. Mein interner Kontakt hat
    mir sehr helfen können

    Nun weiss ich, dass der Weg mit

    QxmlMemBufInputSource_new( )
    QXmlXercesDOMParser_parse_InputSource( )


    für das parsen aus MQ wirklich der richtige Weg ist.

    Wenn man die geforderten Parameter richtig übergibt,
    die nötigen Pointers definiert hat und das gelieferte XML
    valide ist, funktioniert das ganze ohne Probleme.

    Besten Dank nochmal an alle

    Gruss, Roger

  12. #12
    Registriert seit
    Apr 2005
    Beiträge
    104
    Fein, dann ist Dir ja wohl geholfen.

    ich wollte nur noch erwähnen, daß ich meine eigene Erfahrung darin habe, wie man eine größere AS400-Anwendung Web-fähig macht. Habe dort auch MQ-Series verwendet, und XML geparsed und erzeugt. Da mir der IBM-Parser ebenfalls nicht zusagte, habe ich kurzerhand selber einen Parser und die ganze Middleware geschrieben, und war mit Erfolg.

Similar Threads

  1. XML Extender for iSeries
    By mom in forum IBM i Hauptforum
    Antworten: 30
    Letzter Beitrag: 22-01-07, 15:03
  2. Webservices, SOAP, XML und Labeldruck
    By vige1000 in forum NEWSboard Linux
    Antworten: 4
    Letzter Beitrag: 21-12-06, 11:56
  3. XML zu einem Port Senden
    By Weki in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 11-09-06, 13:31
  4. Formfeed in XML
    By kuempi von stein in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-07-06, 08:50
  5. XML
    By DEVJO in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 18-04-05, 09:38

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •