| |
|
|
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 |
|
|
| |
|
|
|
| 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ß. |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
| 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. |
|
|
| |
|
|
|
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: KompilierenMarkierenSeparierenwindow 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 |
|
|
| |
|
|
|
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: KompilierenMarkierenSeparierenwindow 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 |
|
|
| |
|
|
|
Jörg Sellmeyer | Ich hab die Books.xml von hier [...] verwendet. Mit Deinem neuen Code bekomme ich genau einen Eintrag
|
|
|
| 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: KompilierenMarkierenSeparierenwindow 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 |
|
|
| |
|
|
|
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>
|
|
|
| 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 |
|
|
| |
|
|
|
| |
|
| |
|
|