Herstellung eines Telefonbuchs für die Fritz!Box
Hallo in die Runde,
ich hätte gerne Euren Rat bei folgender Aufgabenstellung:
Die AVM-Fritz!Box (mit heutigem OS) erwartet für den Import eines - überarbeiteten oder neu erstellten - 'Telefonbuches' eine Datei im Format 'XML'.
( - früher konnte man diese Aufgabe recht einfach mit Hilfe es "Fritz!Box-Monitors" lösen. Leider wird dieser von AVM nicht mehr unterstützt.)
Ich suche nun ein Tool, vielleicht sogar einen einschlägigen Editor, mit dessen Hilfe man diese für die Fritz!Box strukturierte XML-Datei aus einer vorliegenden Text-Datei (im weitesten Sinne ..) herstellen kann.
Gewisse einmalige Handarbeit, etwa die Erstellung des einheitlichen Datei-Headers, würde ich dabei gerne in Kauf nehmen.
Allerdings scheue ich die lästige, vor allem fehlerträchtige Erzeugung der XML-Strukturen für jeden einzelnen der unter Umständen zahlreichen Datensätze.
Möglicherweise hat jemand aus dieser Runde diese Aufgabe längst zufriedenstellen gelöst ?
Danke im Voraus für Eure Vorschläge!
Mit freundlichen Grüßen
Jürgen
ich hätte gerne Euren Rat bei folgender Aufgabenstellung:
Die AVM-Fritz!Box (mit heutigem OS) erwartet für den Import eines - überarbeiteten oder neu erstellten - 'Telefonbuches' eine Datei im Format 'XML'.
( - früher konnte man diese Aufgabe recht einfach mit Hilfe es "Fritz!Box-Monitors" lösen. Leider wird dieser von AVM nicht mehr unterstützt.)
Ich suche nun ein Tool, vielleicht sogar einen einschlägigen Editor, mit dessen Hilfe man diese für die Fritz!Box strukturierte XML-Datei aus einer vorliegenden Text-Datei (im weitesten Sinne ..) herstellen kann.
Gewisse einmalige Handarbeit, etwa die Erstellung des einheitlichen Datei-Headers, würde ich dabei gerne in Kauf nehmen.
Allerdings scheue ich die lästige, vor allem fehlerträchtige Erzeugung der XML-Strukturen für jeden einzelnen der unter Umständen zahlreichen Datensätze.
Möglicherweise hat jemand aus dieser Runde diese Aufgabe längst zufriedenstellen gelöst ?
Danke im Voraus für Eure Vorschläge!
Mit freundlichen Grüßen
Jürgen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 208836
Url: https://administrator.de/contentid/208836
Ausgedruckt am: 13.11.2024 um 07:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo Jürgen,
das ist sicher kein unlösbares Problem. Ist dir bekannt wie der Aufbau einer solchen XML Datei auszusehen hat? Hast du evtl. ein Beispiel? Das würde in jedem Fall schon mal weiterhelfen einen solchen Code zu schreiben.
Weiterhin: Hast du dir Gedanken darüber gemacht in welcher Form die Daten in deiner Textdatei vorliegen werden? Das ist natürlich ebenso wichtig zu wissen, anderenfalls kann man kaum einen Algorithmus bauen um diese auszulesen.
Grüße
rubberman
das ist sicher kein unlösbares Problem. Ist dir bekannt wie der Aufbau einer solchen XML Datei auszusehen hat? Hast du evtl. ein Beispiel? Das würde in jedem Fall schon mal weiterhelfen einen solchen Code zu schreiben.
Weiterhin: Hast du dir Gedanken darüber gemacht in welcher Form die Daten in deiner Textdatei vorliegen werden? Das ist natürlich ebenso wichtig zu wissen, anderenfalls kann man kaum einen Algorithmus bauen um diese auszulesen.
Grüße
rubberman
Warum sollten Sie mit konventionellen Mitteln schwer herzustellen sein?
Du definierst den Kopf, schreibst dann eine Schleife mit dem einlesen der Daten, solange noch ein Datensatz kommt pflegst du diesen entsprechend der Konvnetion ein und packst am Ende noch den Fuß rein, das schreibst du in die XML Datei, welche du importierst.
Grüße
Du definierst den Kopf, schreibst dann eine Schleife mit dem einlesen der Daten, solange noch ein Datensatz kommt pflegst du diesen entsprechend der Konvnetion ein und packst am Ende noch den Fuß rein, das schreibst du in die XML Datei, welche du importierst.
Grüße
Hallo Jürgen.
Schön. Ich kenne es nicht, somit kann ich nicht helfen. Wäre schon sinnvoll wenn du ein paar Informationen mehr geben könntest. Das war der eigentliche Sinn meiner Nachfrage.
Grüße
rubberman
Schön. Ich kenne es nicht, somit kann ich nicht helfen. Wäre schon sinnvoll wenn du ein paar Informationen mehr geben könntest. Das war der eigentliche Sinn meiner Nachfrage.
Grüße
rubberman
Hallo Jürgen,
die Arbeit hat sich schon mal jemand gemacht und daraus ein Tool gestrickt:
http://software.nv-systems.net/ccw
Grüsse Uwe
die Arbeit hat sich schon mal jemand gemacht und daraus ein Tool gestrickt:
http://software.nv-systems.net/ccw
Grüsse Uwe
Hallo Jürgen.
Grüße
rubberman
"Selber schreiben" wäre also leider nichts geworden ...
Mit entsprechend aussagekräftigem Input deinerseits hätte ich dir sicher ein Script (vermutlich <100 Zeilen Code) zusammen geschrieben. Da braucht es weder C und schon gar kein HTML. Ein simples VBScript bietet den nötigen XML Support.Grüße
rubberman
Hallo Jürgen,
bin auf Arbeit und werde erst heute Abend dazu kommen.
Kopiere die entsprechenden Passagen zwischen <code> </code> Tags, dann behalten sie ihre Formatierung und du brauchst kein PDF.
Vergiss nicht das gleiche mit deiner Text-/CSV Datei zu tun, die als Eingangsformat benötigt wird, bzw lege zumindest die Datenfelder fest, die von dir benötigt werden.
Grüße
rubberman
bin auf Arbeit und werde erst heute Abend dazu kommen.
Kopiere die entsprechenden Passagen zwischen <code> </code> Tags, dann behalten sie ihre Formatierung und du brauchst kein PDF.
Vergiss nicht das gleiche mit deiner Text-/CSV Datei zu tun, die als Eingangsformat benötigt wird, bzw lege zumindest die Datenfelder fest, die von dir benötigt werden.
Grüße
rubberman
Hallo Jürgen,
hab da was für dich.
Wenn deine CSV-Datei mit den Kontakten wie folgt aufgebaut ist:
kannst du mit diesem VBS eine Fritzbox kompatible XML-Datei erstellen, die du dann importieren kannst:
(In Zeile 1 und 2 noch die Pfade zu den Dateien angeben)
Grüße Uwe
hab da was für dich.
Wenn deine CSV-Datei mit den Kontakten wie folgt aufgebaut ist:
CSV-Datei
realName;home;work;mobile;fax_work;
Herbert Mustermann;099929929;024334554345;0151993885;02235235;
Sepp Meier;0558452;;;;
Sabine Mustermann;1235465;11111;44444;;
(In Zeile 1 und 2 noch die Pfade zu den Dateien angeben)
VBS-Code
CSVFILE = "C:\input.csv"
XMLPATH = "C:\phonebook.xml"
strXMLStart = "<?xml version=""1.0"" encoding=""iso-8859-1""?><phonebooks><phonebook>"
strXMLEnd = "</phonebook></phonebooks>"
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
uniqueID = 0
allContacts = ""
Set objCSV = objFSO.OpenTextFile(CSVFILE, ForReading)
header = objCSV.ReadLine
Do Until objCSV.AtEndOfStream
strNextLine = objCSV.Readline
If strNextLine <> "" Then
arrMapping = Split(strNextLine , ";")
realName = Trim(arrMapping(0))
home = Trim(arrMapping(1))
work = Trim(arrMapping(2))
mobile = Trim(arrMapping(3))
fax_work = Trim(arrMapping(4))
contactItemNumbers = ""
numberCounter = 0
If home <> "" Then
contactItemNumbers = "<number type=""home"" prio=""0"" id=""" & numberCounter & """>" & home & "</number>"
numberCounter = numberCounter + 1
End If
If work <> "" Then
contactItemNumbers = contactItemNumbers & "<number type=""work"" prio=""0"" id=""" & numberCounter & """>" & work & "</number>"
numberCounter = numberCounter + 1
End If
If mobile <> "" Then
contactItemNumbers = contactItemNumbers & "<number type=""mobile"" prio=""0"" id=""" & numberCounter & """>" & mobile & "</number>"
numberCounter = numberCounter + 1
End If
If fax_work <> "" Then
contactItemNumbers = contactItemNumbers & "<number type=""fax_work"" prio=""0"" id=""" & numberCounter & """>" & fax_work & "</number>"
numberCounter = numberCounter + 1
End If
ticks = DateDiff("s","1/1/1970 12:00:00 AM",Now)
contactItemPart1 = "<contact><category>0</category><person><realName>" & realName & "</realName></person><telephony nid=""" & numberCounter & """>"
contactItemPart2 = contactItemNumbers
contactItemPart3 = "</telephony><services /><setup /><mod_time>" & ticks & "</mod_time><uniqueid>" & uniqueID & "</uniqueid></contact>"
allContacts = allContacts & contactItemPart1 & contactItemPart2 & contactItemPart3
uniqueID = uniqueID + 1
End if
Loop
objCSV.Close
Set objXMLFile = objFSO.OpenTextFile(XMLPATH,ForWriting, True)
objXMLFile.Write strXMLStart & allContacts & strXMLEnd
objXMLFile.Close
WScript.Echo "Fertig"
Zitat von @Juergenl:
Ebenso kann ich natürlich eine CSV-Datei generieren, - diese mit beliebigem Delimiter ausstatten.
mach das in obiges FormatEbenso kann ich natürlich eine CSV-Datei generieren, - diese mit beliebigem Delimiter ausstatten.
Ich war und bin mir aber nicht sicher, ob man mit Hilfe des Headers und dortiger korrekter Verwendung der offiziellen
Schlüsselworte eine ebenso vereinfachte (d.h. vierfeldrige) CSV-Datei bilden kann ? Oder muß man dafür jenes
"21-feldrige Datei-Monstrum" mit siebzehn Leer-Feldern definieren ?
Iin diesem Zusammenhang wüßte ich gerne auch, wo ich die korrekten Schlüsselworte für meine Felder nachgucken
kann: Ich habe irgendwo die Ausdrücke "VIP" bzw. "SpeedDial" gelesen, weiß aber nicht ob sie
korrekt sind.
Du nimmst deine vorhandene CSV öffnest sie z.B. in Excel und passt sie dem obigen Format an d.h. überflüssige Spalten löschen und in obige Reihenfolge bringen und wieder in eine CSV speichern, was ist daran so schwer ?Schlüsselworte eine ebenso vereinfachte (d.h. vierfeldrige) CSV-Datei bilden kann ? Oder muß man dafür jenes
"21-feldrige Datei-Monstrum" mit siebzehn Leer-Feldern definieren ?
Iin diesem Zusammenhang wüßte ich gerne auch, wo ich die korrekten Schlüsselworte für meine Felder nachgucken
kann: Ich habe irgendwo die Ausdrücke "VIP" bzw. "SpeedDial" gelesen, weiß aber nicht ob sie
korrekt sind.
Der SpeedDial-Eintrag ist in obigem Script noch nicht mit drin lässt sich aber leicht ergänzen.
Würdet Ihr mir bitte noch verraten, wie man hier im Forum ggf. Quelltext veröffentlicht ? ( - ich hab' leider so
mancherlei Forums-Handwerkszeug wieder vergessen.)
Programm-Code kannst du mit Code-Tags hier im Beitrag posten.mancherlei Forums-Handwerkszeug wieder vergessen.)
Grüße Uwe
gelöste Beitrage bitte auch als solche markieren.Danke
Hallo ihr beiden.
@Juergenl
Ich werde unten mal auf 5 Datenfelder erweitern.
Aber vergiss es einfach. Dank colinardo und einer kurzen Googlesuche ist mir der Aufbau nun auch klar (sonst dauert das hier noch Tage ...).
@colinardo
Wenn ich oben von "XML Support" gesprochen habe, dachte ich eigentlich an das XML DOM. Per Stringverknüpfung geht's natürlich auch
Beim Testen deines Codes bin ich aber gleich in eine Falle getappt. Die XML Datei existierte bei mir noch nicht, darum musste ich Zeile 49 ändern.
Wie auch immer, mein Lösungsvorschlag.
CSV Datei mit 5 Datenfeldern. Name;Typ;Telefonnummer;VIP;Kurzwahl;
test.csv
*.vbs
Grüße
rubberman
@Juergenl
Datenfelder "Vor & Zuname"; "Telefon" (home oder work); "VIP"; "Kurzwahl-Nummer"
Hmm, und wo steht nun die eigentliche Telefonnummer? Feld 2 gibt ja (so wie ich es verstehe) lediglich den Typ an.Ich werde unten mal auf 5 Datenfelder erweitern.
Ich habe zur Zeit keinen "richtigen" Editor zur Verfügung
Für Text (und nichts anderes ist XML) gibt es auf jeder Windows Kiste den Notepad Editor. Ich hätte es weder in Farbe und bunt benötigt, noch mit irgendwelchen Einrückungen der Knoten. Auf den Inhalt kommt es an.Aber vergiss es einfach. Dank colinardo und einer kurzen Googlesuche ist mir der Aufbau nun auch klar (sonst dauert das hier noch Tage ...).
@colinardo
Wenn ich oben von "XML Support" gesprochen habe, dachte ich eigentlich an das XML DOM. Per Stringverknüpfung geht's natürlich auch
Beim Testen deines Codes bin ich aber gleich in eine Falle getappt. Die XML Datei existierte bei mir noch nicht, darum musste ich Zeile 49 ändern.
Set objXMLFile = objFSO.OpenTextFile(XMLPATH,ForWriting,True)
Wie auch immer, mein Lösungsvorschlag.
CSV Datei mit 5 Datenfeldern. Name;Typ;Telefonnummer;VIP;Kurzwahl;
test.csv
Lieschen Müller;mobile;0172333444555;1;5;
Klaus Bärbel;home;02345654321;;6;
Fa. GWS Röhrig;work;02345110112;;;
*.vbs
Option Explicit
' Dateinamen
Const sCSV_in = "test.csv"
Const sXML_out = "test.xml"
' Variablendeklarationen
Dim oXmlDoc, oPhonebookNode, oContactNode, oCategoryNode, oPersonNode, _
oTelephonyNode, oServicesNode, oSetupNode, oModtimeNode, oUniqueIDNode, _
oRealNameNode, oNumberNode, oRingToneNode, oXsltDoc
Dim oFSO, oFile, i, aLine, sLine, sName, sType, sNumber, sCategory, sQuickdial
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile(sCSV_in) 'CSV Filestream
CreateObject("WScript.Shell").CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName) 'Arebeitsverzeichnis = Scriptverzeichnis
Set oXmlDoc = CreateObject("Msxml2.DOMDocument.6.0") 'XML Dokument erzeugen
oXmlDoc.async = False
oXmlDoc.loadXML "<?xml version=""1.0"" encoding=""windows-1252""?><phonebooks />" 'XML Deklaration und Rootelement
Set oPhonebookNode = oXmlDoc.createNode(1, "phonebook", "") 'phonebook Element hinzu
oXmlDoc.documentElement.appendChild oPhonebookNode
i = 0 'wird bei jedem Schleifendurchlauf inkrementiert und für "uniqueid" eingesetzt
While Not oFile.AtEndOfStream 'solange das Dateiende nicht erreicht ist
i = i + 1 'i inkrementieren
sLine = oFile.ReadLine '(nächste) Zeile lesen
If sLine <> "" Then
aLine = Split(sLine, ";") 'an den Semikola in ein Array splitten
If UBound(aLine) <> 5 Then
WScript.Echo "Zeile """ & sLine & """ hat die falsche Anzahl Elemente"
Else
sName = Trim(aLine(0)) 'Name
sType = Trim(aLine(1)) 'Typ (home, work, mobile)
sNumber = Trim(aLine(2)) 'Telefonnummer
sCategory = Trim(aLine(3)) 'VIP
sQuickdial = Trim(aLine(4)) 'Kurzwahl
'Einzelne Knoten und Kindknoten für jeden Kontakt erstellen
Set oContactNode = oXmlDoc.createNode(1, "contact", "")
oPhonebookNode.appendChild oContactNode
Set oCategoryNode = oXmlDoc.createNode(1, "category", "")
oContactNode.appendChild oCategoryNode
Set oPersonNode = oXmlDoc.createNode(1, "person", "")
oContactNode.appendChild oPersonNode
Set oTelephonyNode = oXmlDoc.createNode(1, "telephony", "")
oTelephonyNode.setAttribute "nid", "1"
oContactNode.appendChild oTelephonyNode
Set oServicesNode = oXmlDoc.createNode(1, "services", "")
oContactNode.appendChild oServicesNode
Set oSetupNode = oXmlDoc.createNode(1, "setup", "")
oContactNode.appendChild oSetupNode
Set oModtimeNode = oXmlDoc.createNode(1, "mod_time", "")
oContactNode.appendChild oModtimeNode
Set oUniqueIDNode = oXmlDoc.createNode(1, "uniqueid", "")
oContactNode.appendChild oUniqueIDNode
Set oRingToneNode = oXmlDoc.createNode(1, "ringTone", "")
oSetupNode.appendChild oRingToneNode
oModTimeNode.text = CStr(DateDiff("s", DateSerial(1970, 1, 1) + TimeSerial(12, 0, 0), Now)) 'UNC Timestamp
oUniqueIDNode.text = CStr(i)
Set oRealNameNode = oXmlDoc.createNode(1, "realName", "")
oPersonNode.appendChild oRealNameNode
oPersonNode.text = sName
Set oNumberNode = oXmlDoc.createNode(1, "number", "")
oTelephonyNode.appendChild oNumberNode
oNumberNode.setAttribute "type", sType
oNumberNode.setAttribute "id", "0"
If sQuickdial = "" Then
oNumberNode.setAttribute "vanity", ""
Else
oNumberNode.setAttribute "quickdial", sQuickdial
End If
oNumberNode.setAttribute "prio", "1"
oNumberNode.text = sNumber
If sCategory <> "" Then oCategoryNode.text = "1"
End If
End If
Wend
oFile.Close 'CSV Dateistream schließen
' Stylesheet: XML Dokument mit Zeileneinrückung (damit es lesbar wird) und der korrekten Zeichencodierung versehen
Set oXsltDoc = CreateObject("Msxml2.DOMDocument.6.0")
oXsltDoc.async = False
oXsltDoc.loadXML( _
"<?xml version=""1.0"" encoding=""windows-1252""?>" & vbNewLine & _
"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbNewLine & _
" <xsl:output method=""xml"" version=""1.0"" encoding=""iso-8859-1"" indent=""yes"" />" & vbNewLine & _
" <xsl:template match=""node()|@*"">" & vbNewLine & _
" <xsl:copy>" & vbNewLine & _
" <xsl:apply-templates select=""node()|@*"" />" & vbNewLine & _
" </xsl:copy>" & vbNewLine & _
" </xsl:template>" & vbNewLine & _
"</xsl:stylesheet>")
oXmlDoc.transformNodeToObject oXsltDoc, oXmlDoc
oXmlDoc.save(sXML_out) 'XML Dokument speichern
Grüße
rubberman
Hallo Jürgen.
Ob das den Anspruch auf Vollständigkeit erhebt, kann ich nicht beurteilen.
Grüße
rubberman
Du hast mich einer Deiner Rückfrage zu 'home' etwas verunsichert: Ich habe an der einen oder anderen Stelle nämlich gesehen, daß 'home' auch als Begriff (oder Datenfeld) für die "häusliche Telefonnummer" verwendet wurde ( - zwar auch für deren Typisierung -) oder habe ich da etwas mißverstanden? - Wäre 'phone' an der Stelle korrekt ?
home ist eine Typisierung, ebenso wie work und mobile. Darum hat mich deine Auflistung der Datenfelder verunsichert. phone gibt es nicht. Ein konstruiertes Beispiel, so wie von Uwe und mir zum Testen der Codes, hätte Klarheit gebracht. Nun bin ich immer noch so schlau wie vorher, da ich immer noch nicht weiß wie die Daten bei dir vorliegen. Unser Output kann nicht besser sein als dein Input!Ich würde gerne einmal eine vollständige - verbindliche - Liste dieser Schlüsselwörter einsehen, damit ich wenigsten dabei keine vermeidbaren Fehler mache.
www.wehavemorefun.de/fritzbox/XML-AdressbuchOb das den Anspruch auf Vollständigkeit erhebt, kann ich nicht beurteilen.
sind englische und deutsche Schlüsselwörter eigentlich austauschbar ?
Nicht in der XML Datei selbst. Ansonsten sieh dir die Beschreibungen aus dem Link an, damit sollte die Bedeutung klar sein.Grüße
rubberman