Deutsch
Forum

XML Bearbeitung

 

Christian
Hahn
Hallo an alle,

hat jemand eine Idee wie man XML/XHTML Dokumente in ein Verzeichnisbaum (DOM) einlesen, bearbeiten und wieder speichern kann? Ideal dafür währe von "Pascal" TvConti1. Am besten ist wahrscheinlich eine Umsetzung in Assembler, wegen Geschwindigkeit, oder gibt es schon Module (DLL?).
Das XML Format findet ja immer mehr Verbreitung und man sollte damit auch in XProfan etwas anfangen können, zumal es ja freie XSLT-Prozessoren zum Umwandeln in andere Datenformate (z.B. [...]  ) gibt, damit kann man auch die Wohlgeformtheit prüfen.

Meine Vorstellung:
XML Datei in Baum laden -> Elemente einfügen, löschen oder bearbeiten -> als XML speichern und/oder über XSLT-Prozessor als z.B json exportieren

Auf jeden Fall habe ich keinen Plan!

Einen guten Rutsch und viel Erfolg im Jahr 2010 wünscht
Christian Hahn
 
Windows XP und Profan10 | Homepage... | Folge mir...
29.12.2009  
 



Irgendwo hatte ich mal einen einfachen XML-Parser gepostet, hier konnte man zwischen Objekten, Nodes, ... unterscheiden und einfach eigene Methoden einfügen - finds nicht... war glaube nach [...]  entstanden.

Egal, "heute würde ichs eh anders machen" - so eine xml.inc für XProfan existiert leider (noch) nicht aber wäre spätestens mit [...]  ein Parser hierfür programmierbar der auch blitzschnell sein könnte.

Wenn Interesse, dann kann ich so einen kleinen XML-Parser später auch nochmal vormachen. Um den Baum innerprogrammlich zu "merken" (nicht Darstellung!) und für einfache Handhabung beim Einfügen/Löschen/Bearbeiten von Nodes, würde ich aber eine einfache ListBox nehmen deren Einträge z.B. am Ende einen Einrückungszähler besitzen. Somit liesse sich auch blitzschnell Suchen.

Das Schreiben dann von XML ist ein eigener Spass, braucht man aber auch keine Libs oder DLLs für - einfaches XML-Zeugs in XProfan würde ich auf <300 Zeilen schätzen also kleine Fleißarbeit.

Das Aufwändigste wäre imho ein schöner Editor!

Vlt. hat Roland aber auch für XProfan12 etwas zum Thema XML im Petto, wer weiß.
 
29.12.2009  
 




Christian
Hahn
So ein Parser wäre schon nicht schlecht.
Es besteht auch noch die Möglichkeit über ein AktiveX-Objekt (msxml.dll) über "Pascals" OcxPackage. Nur blicke ich bei der DLL noch viel weniger durch.
 
Windows XP und Profan10 | Homepage... | Folge mir...
29.12.2009  
 



Z.B.:

+ Datei in String laden
+ Strings im String in Platzhalter tauschen z.B. x01ID und damit rausfiltern (q bis q suchen bis kein q mehr enthalten)
+ Alle Tabs und Doppelten Freizeichen bzw. unnütze Zeichen mit Translate$ lünchen solange bis keine mehr da
+ Explode(upper(s),"<")

... und Du hast schonmal das Schlimmste über native Schleifen abgearbeitet - also recht fix.

Das zurückgegebene Array kann nun einfach runtergerasselt werden von einer Funktion, die nur noch einzelne Anweisungen/Strings verarbeiten muss und nicht mehr das Problem hat, erst noch die XML zu parsen.
 
29.12.2009  
 




Uwe
''Pascal''
Niemeier
Hi Leute!

Wenn ich zweimal in einem Thread erwähnt werde, muß ich mich ja melden

Tatsächlich kann man per ActiveX anscheinend sehr einfach auf XML zugreifen:
KompilierenMarkierenSeparieren
window 700,500--Infos gefunden bei MSDN unter "XML DOM Objects/Interfaces "
 $H Windows.ph
 $H ocx3a.ph
 $I ocx3a.inc
 $I ocxInfo.inc--Zu Analysezwecken
ocxInit()
declare NodeList&
var Xml&=ocxCreate("Msxml2.DOMDocument")--oder Msxml2.FreeThreadedDOMDocument ?
ocxBrowse(Xml&)
var File$="X:Books.xml"--Demo-Datei; gibts bei MSDN; enthält anscheinend Infos über Bücher
ocxMethod(Xml&,"load",File$)
print File$
print "Name  :",ocxGet(Xml&,"NodeName")
print "Type  :",ocxGet(Xml&,"NodeTypeString")
print "Value :",ocxGet(Xml&,"NodeValue")
NodeList&=ocxGet(Xml&,"childNodes")---------Sammlung von ChildNodes
ocxBrowse(NodeList&)
print "Childs:",ocxGet(NodeList&,"length")--Anzahl Nodes in NodeList
ocxRelease(NodeList&)
print
print "Child1"
var Child1&=ocxGet(Xml&,"firstChild")
ocxBrowse(Child1&)
print "Name  :",ocxGet(Child1&,"NodeName")
print "Type  :",ocxGet(Child1&,"NodeTypeString")
print "Value :",ocxGet(Child1&,"NodeValue")
NodeList&=ocxGet(Child1&,"childNodes")
print "Childs:",ocxGet(NodeList&,"length")
ocxRelease(NodeList&)
print
print "Child2"
var Child2&=ocxGet(Child1&,"nextSibling")
ocxBrowse(Child2&)
print "Name  :",ocxGet(Child2&,"NodeName")
print "Type  :",ocxGet(Child2&,"NodeTypeString")
print "Value :",ocxGet(Child2&,"nodeValue")
NodeList&=ocxGet(Child2&,"childNodes")
print "Childs:",ocxGet(NodeList&,"length")
ocxRelease(NodeList&)
ocxDeInit()--Alle ausstehenden Freigaben erfolgen hier
waitkey

Das Problem ist: Ich habe sowas von keine Ahnung von XML...
Wenn ich das richtig sehe, wird da so ne Art von Verzeichnis-Struktur gespeichert?
Mit Parents und Children?

Mal ganz allgemein zu ocx: Damit läßt sich praktisch alles umsetzen,
was auch mit irgendeiner Scriptsprache möglich ist.
Wenns also Beispiele für VBS oder JS gibt...

HTH
Pascal
 
30.12.2009  
 




Jörg
Sellmeyer
Hast Du die ocxinfo.inc auch schon irgendwo hochgeladen?

Ok - gefunden: [...] 

Hm - bei mir krachts beim ersten ocxGet(Child1&,"NodeName")
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
30.12.2009  
 




Uwe
''Pascal''
Niemeier
Hi Jörg!

Laß dir die ermittelten ObjektHandles ausgeben; da ist wahrscheinlich ne Null dazwischen.
Im Zweifelsfall müßtest du mal eine betroffene XML bereitstellen.

Habe inzwischen etwas rumgebastelt:
KompilierenMarkierenSeparieren
window 700,500
 $H Windows.ph
 $H ocx3a.ph
 $I ocx3a.inc
 $I ocxInfo.inc---Zu Analysezwecken (ocxName)

proc Auflisten---------------------------------------------Auflisten

    parameters ParentNode&,TvRoot&
    declare Node&
    var Name$=ocxGet(ParentNode&,"NodeName")
    var Wert$=ocxGet(ParentNode&,"NodeValue")
    var Type$=ocxName(ParentNode&)--aus ocxInfo.inc
    var Text$="Name:"+Name$+" / Type:"+Type$+" / Wert:"+Wert$
    TvRoot&=TreeView("InsertItem",Tv&,TvRoot&,0,Text$)
    settext %hwnd,"Einträge: "+str$(getcount(Tv&))
    var NodeMap&=ocxGet(ParentNode&,"attributes")

    if NodeMap&-------wird *nicht* leer erzeugt außer bei <author/> in Wiedergabelisten!

        whileloop 0,ocxGet(NodeMap&,"length")-1

            Node&=ocxGet(NodeMap&,"Item",&loop)
            Name$=ocxGet(Node&,"NodeName")
            Wert$=ocxGet(Node&,"NodeValue")
            Type$=ocxName(Node&)--aus ocxInfo.inc
            Text$="Name:"+Name$+" / Type:"+Type$+" / Wert:"+Wert$
            TreeView("InsertItem",Tv&,TvRoot&,0,Text$)
            ocxRelease(Node&)

        endwhile

        TreeView("SetChildren",Tv&,TvRoot&,1)
        ocxRelease(NodeMap&)

    endif

    var NodeList&=ocxGet(ParentNode&,"childNodes")
    var Count%=ocxGet(NodeList&,"length")

    if Count%---------NodeList wird auch *leer* erzeugt!

        TreeView("SetChildren",Tv&,TvRoot&,1)

        whileloop 0,Count%-1

            Node&=ocxMethod(NodeList&,"Item",&loop)
            Auflisten(Node&,TvRoot&)--rekursiver Aufruf *dieser* PROC
            ocxRelease(Node&)

        endwhile

    endif

    ocxRelease(NodeList&)
    endproc-------------------------------------------------------------
    var File$="X:Books.xml"-----------------Demo-Datei von MSDN
    var File$="X:Delain - April Rain.wpl"--WMP-Wiedergabeliste + Schleichwerbung ;-)
    var File$="X:Manifest.xml"-------------externes Manifest
    var File$="RES://X:PROFAN.EXE/24/1"----internes(!) Manifest
    var Tv&=create("TreeView",%hwnd,0,10,10,600,400)
    sendmessage(Tv&,$111B,20,0)-- Höhe 20 px sieht besser aus
    ocxInit()
    var Xml&=ocxCreate("Msxml2.DOMDocument")
    ocxMethod(Xml&,"load",File$)
    Auflisten(Xml&,0)
    ocxRelease(Xml&)
    ocxDeInit()
    waitkey

Scheint doch recht interessant zu sein, wenn man sieht, was alles in diesem Format gespeichert wird

HTH
Pascal
 
30.12.2009  
 




Jörg
Sellmeyer
Ich hab die Books.xml von hier [...]  verwendet. Mit Deinem neuen Code bekomme ich genau einen Eintrag


9 kB
Hochgeladen:30.12.2009
Ladeanzahl192
Herunterladen
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
30.12.2009  
 




Uwe
''Pascal''
Niemeier
Hi Jörg!

Hier noch ein Minimal-Beispiel:
KompilierenMarkierenSeparieren
window 700,200
 $H Windows.ph
 $H ocx3a.ph
 $I ocx3a.inc
 $I ocxInfo.inc
ocxInit()
var File$="X:Books.xml"
var Document&=ocxCreate("Msxml2.DOMDocument")
print "Document   :",ocxName(Document&),Document&
print "Load       :",ocxMethod(Document&,"load",File$)----- OK = -1
print "HasChildren:",ocxMethod(Document&,"hasChildNodes")-- OK = -1
print
var NodeList&=ocxGet(Document&,"childNodes")
print "NodeList   :",ocxName(NodeList&),NodeList&
print "Children   :",ocxGet(NodeList&,"length")
print
var Child1&=ocxGet(NodeList&,"Item",0)
print "Child1     :",ocxName(Child1&),Child1&
print
var Child2&=ocxGet(NodeList&,"Item",1)
print "Child2     :",ocxName(Child2&),Child2&
ocxDeInit()
waitkey


SeeYou
Pascal
 
30.12.2009  
 




Jörg
Sellmeyer
Das ist das Ergebnis:



Hier ist eine manifest.xml, die bei mir funktioniert:



<?xml version="1.0" encoding="utf-8" ?>

<Package>

<Files Time="2001-07-20T23:29" Version="6.10.0016.1624" UIVer="1" PVersion="1616.24">

<Group Name="Critical" Url="..%2F..">

<File Name="Setupmsn9xmig.dll" Hash="006066179165170056004117042027217067195106042074181195074251" Size="3113" />

<File Name="Setupmigrate.dll" Hash="120148054021128063087048224016070163125174141252154003252201" Size="6016" />

<File Name="Setupmsnunin.exe" Hash="147181051126107112026028028084075160235154203200136161005023" Size="10240" />

<File Name="Setupmsnupgrd.inf" Hash="125086141049240177093045079083031044130029053183152029117245" Size="1047" />

<File Name="update.exe" Hash="126176124138080243188000135117163158226243039019180233159055" Size="30385" />

<File Name="msn6.exe" Hash="006149214051173132208153170250222117015068119056143216146188" Size="35941" />

<File Name="msnmetal.dll" Hash="139222237220200125099180190237204090177042208036217100012005" Size="453887" />

<File Name="msnmetal.we" Hash="023243225112125023248001254127119245124186015087165002176133" Size="150" />

<File Name="msnmetal.jcf" Hash="015082022006163004024136080243235247076003053095217200074128" Size="335" />

<File Name="msnmtllc.dll" Hash="103213015196175139233189196084105224143197025191111198183128" Size="17437" />

<File Name="msdbx.dll" Hash="118134049132248230089107171240054011219203181122100015218171" Size="26934" />

<File Name="msmom.dll" Hash="060102191237075219042245223186161015180130062254109078088100" Size="157792" />

<File Name="mail.mar" Hash="240014088069073059201007196194061011152057227206204109232016" Size="364421" />

<File Name="msnspell.dll" Hash="203223218164002229225023241251048233169021174054217028190124" Size="40259" />

<File Name="ui.mar" Hash="117215007222123179218106170148139080251180197208206017209118" Size="753415" />

<File Name="themedef.mar" Hash="105202095191069095207180200130060011062116142182209018157136" Size="1685601" />

<File Name="online.wav" Hash="104075253182074126235179186237223025242101123104127176099234" Size="5451" />

<File Name="newalert.wav" Hash="083176106012043122243127129126094248126132072119131170165188" Size="5993" />

<File Name="newemail.wav" Hash="005174229057034062223137093022068055019033213065145087120025" Size="12673" />

<File Name="highcont.mar" Hash="183070080040218235143191194023106061103073214238009061033043" Size="14799" />

<File Name="logonmgr.dll" Hash="135103147080221162183118122093044129001050062038033076163233" Size="90407" />

<File Name="custdial.dll" Hash="068197186065205130048225193223009014097071087039064217251197" Size="5509" />

<File Name="popc.dll" Hash="228027200152051028162196005143045144236188237126077185076057" Size="37117" />

<File Name="csapi3t1.dll" Hash="071164211144136204149196127251168194082167196207073147167145" Size="25151" />

<File Name="sqdll.dll" Hash="001093243247112100005123020104046218078008216203154190233234" Size="48088" />

<File Name="migrate.dll" Hash="247106073105042095245071185154082231193238002156159027212163" Size="19934" />

<File Name="migrate.ini" Hash="165211176093249061213227078043167068055207226170130128217126" Size="1478" />

<File Name="msnread.htm" Hash="225174234203141194067230004236015066081162117205112132253151" Size="2636" />

<File Name="copymar.exe" Hash="037246075051221141152118110018039042171016246196076208013015" Size="30922" />

<File Name="msnms.ico" Hash="174088073234197219042105240147080251069093080241103116041014" Size="11132" />

<File Name="msncpq.ico" Hash="072052134122204103095084055034249090099123099023110222102238" Size="1587" />

<File Name="msndell.ico" Hash="233196142148081218026231250137196189025117213114158034229226" Size="2036" />

<File Name="msnemail.ico" Hash="079065027154132221009120228254187076034146096227241035228056" Size="9619" />

<File Name="dw.exe" Hash="203116166131183102034228049251132066110211089229169235150092" Size="79577" />

<File Name="dwprivacy.hta" Hash="246046109212201060072014018055060076199018235160144093155023" Size="422" />

<File Name="license.txt" Hash="177073050057003031039245181059059064051016183241076160127015" Size="3476" />

<File Name="1031dwintl.dll" Hash="002231003043088016210131193244062125011131157246035230242221" Size="6619" />

<File Name="signup.mar" Hash="225029173094124230228029251215250191045068229139070026127072" Size="149313" />

</Group>

<Group Name="Market" Url="..">

<File Name="market.mar" Hash="090164182255085249018042253002090236154170121128151046207011" Size="138373" />

<File Name="market.ini" Hash="124027011004043154130249070156143013233094135078250128200114" Size="177" />

</Group>

<Group Name="Brand">

<File Name="Setupmsn.inf" Hash="209137000128079246159003094191074002224238030003105180194219" Size="4052" />

</Group>

<Group Name="Messenger" Url="..%2F.." SetupExe="mmssetup.exe" Size="769976" Version="3,6,0,26">

<File Name="mcmess.dll" Hash="9,2000,1110,1" />

<File Name="msgsc.dll" Hash="3,6,0,26" />

<File Name="msgslang.dll" Hash="3,6,0,26" />

<File Name="msgsmigr.dll" Hash="3,6,0,26" />

<File Name="msgstrst.dll" Hash="3,6,0,26" />

<File Name="msmsgs.exe" Hash="3,6,0,26" />

<File Name="n2pcli.dll" Hash="2,1,16,0" />

</Group>

</Files>

</Package>

46 kB
Hochgeladen:30.12.2009
Ladeanzahl161
Herunterladen
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
30.12.2009  
 




Uwe
''Pascal''
Niemeier
Hi Jörg!

Auch mit deiner XML keine Probleme
Anscheinend wird bei dir die Datei nicht geladen. Überprüf doch mal den Dateipfad!
(Hab ja - wie immer - keine Fehlerabfrage eingebaut)

BTW:...räusper... das X: vor Books.xml ist mein Laufwerk und hat nichts mit den Funktionen zu tun...
Hätte ich vielleicht erwähnen sollen...

HTH
Pascal
 
31.12.2009  
 



Vlt. am besten File per:
KompilierenMarkierenSeparieren
proc furi

    parameters s$
    return "file:///"+translate$(translate$(s$,"\","/"),"//","/")

endproc

 
31.12.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

17.972 Betrachtungen

Unbenanntvor 0 min.
Thomas Zielinski02.08.2024
Axel Berse12.07.2024
H.Brill14.06.2023
Erasmus.Herold06.01.2023
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie