Batch für Bereiche aus svg-Files auslesen und einzeln in svg-Files schreiben
Habe vergebens nach einer Lösung gesucht, aus einer svg-Datei mit mehreren Signaturen - mit einem Batch - pro Signatur ein svg-File zu erstellen.
Ausgangslage:
Beispiel svg-File (Files können bis 100 Signaturen enthalten):
</style>
<g id="Rechteck_015">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
<g id="Rechteck_015_gestrichelt">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" stroke-dasharray="6,2" width="33.675" height="20.92"/>
</g>
<g id="Rechteck_015_ausgezogen">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Ziel mittels Batch pro Signatur ein svg-File mit Signatur als Dateiname zu erzeugen:
Dateiname: Rechteck_015.svg
<g id="Rechteck_015">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Dateiname: Rechteck_015_gestrichelt.svg
<g id="Rechteck_015_gestrichelt">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" stroke-dasharray="6,2" width="33.675" height="20.92"/>
</g>
</svg>
Dateiname: Rechteck_015_ausgezogen.svg
<g id="Rechteck_015_ausgezogen">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Mit bestem Dank für eure Unterstützung!
Beispiel svg-File (Files können bis 100 Signaturen enthalten):
</style>
<g id="Rechteck_015">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
<g id="Rechteck_015_gestrichelt">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" stroke-dasharray="6,2" width="33.675" height="20.92"/>
</g>
<g id="Rechteck_015_ausgezogen">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Ziel mittels Batch pro Signatur ein svg-File mit Signatur als Dateiname zu erzeugen:
Dateiname: Rechteck_015.svg
<g id="Rechteck_015">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Dateiname: Rechteck_015_gestrichelt.svg
<g id="Rechteck_015_gestrichelt">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" stroke-dasharray="6,2" width="33.675" height="20.92"/>
</g>
</svg>
Dateiname: Rechteck_015_ausgezogen.svg
<g id="Rechteck_015_ausgezogen">
<rect x="0.76" y="9.098" fill="none" stroke="#0000FF" stroke-width="1.5" width="33.675" height="20.92"/>
</g>
</svg>
Mit bestem Dank für eure Unterstützung!
Please also mark the comments that contributed to the solution of the article
Content-Key: 171475
Url: https://administrator.de/contentid/171475
Printed on: April 25, 2024 at 06:04 o'clock
13 Comments
Latest comment
Hallo GIS2000,
Leider fehlt uns Folgendes:
Du kannst dir gar nicht vorstellen, wie häufig solche Themen hier schon angesprochen wurden.
Zum Beispiel hier.
Mit bestem Gruß
Dominique
Leider fehlt uns Folgendes:
- Ein freundliches "Hallo"
- Ein freundlicher Gruß
- Code-Tags, welche die Lesbarkeit des Dateiinhalts verbessern
- Dein Wille, die Forensuche oder Google zu bemühen.
Du kannst dir gar nicht vorstellen, wie häufig solche Themen hier schon angesprochen wurden.
Zum Beispiel hier.
Mit bestem Gruß
Dominique
Hallo GIS2000, willkommen im Forum.
Da SVG ein XML-basiertes Format ist, ist die Verarbeitung per Batch eher suboptimal. VBScript ist hier besser geeignet, Microsoft stellt mit XML DOM ein ActiveX Object zur Verfügung, mit dessen Hilfe solche Aufgaben recht sinnvoll umzusetzen sind.
Die von dir beschriebenen Outputs sind aber keine gültigen SVG Dateien. Sie entsprechen nicht dem Standard und sind vermutlich auch nicht funktionstüchtig. Bitte noch mal überdenken.
Grüße
rubberman
Da SVG ein XML-basiertes Format ist, ist die Verarbeitung per Batch eher suboptimal. VBScript ist hier besser geeignet, Microsoft stellt mit XML DOM ein ActiveX Object zur Verfügung, mit dessen Hilfe solche Aufgaben recht sinnvoll umzusetzen sind.
Die von dir beschriebenen Outputs sind aber keine gültigen SVG Dateien. Sie entsprechen nicht dem Standard und sind vermutlich auch nicht funktionstüchtig. Bitte noch mal überdenken.
Grüße
rubberman
... wobei auf Basis des Beispiels oben eine Batchlösung durchaus möglich sein sollte (aber VBS die bessere Wahl bleibt ):
Falls ev die zu erstellenden Dateien zusätzlich als erste Zeile
enthalten sollen, die Zeile 11 durch folgende Zeilen ersetzen:
Damit würde dann auch gleich dafür gesorgt, dass ev bereits vorhandene Zieldateien überschrieben werden. Das Neu-Erstellen der Zieldateien ließe sich in der ursprünglichen Fassung mit folgender Zeile 11 erreichen:
Grüße
bastla
@echo off & setlocal
set "Datei=test.svg"
set "Schreiben="
for /f "usebackq delims=" %%i in ("%Datei%") do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
echo "%Zeile%"|findstr /c:"<g id=">nul && (
set "Schreiben=true"
for /f "tokens=2 delims=>=" %%a in ("%Zeile%") do set "DateiNeu=%%~a.svg"
)
if defined Schreiben (
setlocal enabledelayedexpansion
echo !Zeile!
endlocal
)>>"%DateiNeu%"
echo "%Zeile%"|findstr "</g>">nul && (
set "Schreiben="
echo ^</svg^>
)>>"%DateiNeu%"
goto :eof
<svg>
for /f "tokens=2 delims=>=" %%a in ("%Zeile%") do (
set "DateiNeu=%%~a.svg"
>"%%~a.svg" echo ^<svg^>
)
for /f "tokens=2 delims=>=" %%a in ("%Zeile%") do set "DateiNeu=%%~a.svg" & del "%%~a.svg" 2>nul
bastla
@bastla:
Auch, wenn ich diese Frage nicht als ernst gemeinte Frage interpretiere...
...Mal kurz überlegen...
Ich glaube, ich würde dieses empfehlen, da die Datei, wie oben gezeigt immer die selbe Zeilenanzahl in den Signaturen vorweist.
Ein wenig Denken und weiter suchen ist wohl auch ganz sinnvoll, er möchte ja die ID als Namen für die Ausgangsdatei verwenden.
Eine Zeile anhand Ihrer Eigenschaften (z.B. der Beginn: <g id=") zu lokalisieren und zu splitten/zu kürzen stellt kein Hexenwerk da.
Ggf. ist das auch sehr hilfreich. Es beschreibt zumindest, wie er Dateien einliest und den Inhalt einer Zeile prüft.
Hier sollte er den Anfang der Zeile <g id=" überprüfen und damit arbeiten können.
Letztendlich ist keins der Themen eine Fertiglösung. Ein wenig Eigeninitiative ist wohl auch kein schlechter Einsatz.
Trotzdem denke ich, dass GIS2000 mit der Forensuche oder gar Google schon etwas weiter gekommen wäre. Es ist ja nicht so, dass er der Erste ist, der auf die Idee kommt, eine Datei via Script in mehrere Dateien aufzuteilen.
Gruß
Dominique
Auch, wenn ich diese Frage nicht als ernst gemeinte Frage interpretiere...
...Mal kurz überlegen...
Ich glaube, ich würde dieses empfehlen, da die Datei, wie oben gezeigt immer die selbe Zeilenanzahl in den Signaturen vorweist.
Ein wenig Denken und weiter suchen ist wohl auch ganz sinnvoll, er möchte ja die ID als Namen für die Ausgangsdatei verwenden.
Eine Zeile anhand Ihrer Eigenschaften (z.B. der Beginn: <g id=") zu lokalisieren und zu splitten/zu kürzen stellt kein Hexenwerk da.
Ggf. ist das auch sehr hilfreich. Es beschreibt zumindest, wie er Dateien einliest und den Inhalt einer Zeile prüft.
Hier sollte er den Anfang der Zeile <g id=" überprüfen und damit arbeiten können.
Letztendlich ist keins der Themen eine Fertiglösung. Ein wenig Eigeninitiative ist wohl auch kein schlechter Einsatz.
Trotzdem denke ich, dass GIS2000 mit der Forensuche oder gar Google schon etwas weiter gekommen wäre. Es ist ja nicht so, dass er der Erste ist, der auf die Idee kommt, eine Datei via Script in mehrere Dateien aufzuteilen.
Gruß
Dominique
@dominique01520
So unernst war die Frage gar nicht gemeint ...
Natürlich haben wir viele Threads mit ähnlichen Themen - aber wer nicht schon ein gewisses Maß an Scripting-Fähigkeiten mitbringt (und dass dem so wäre, hätte ich dem Eröffnungsposting nicht entnommen) und nur noch Details (wie sie zB diesem relativ aktuellen Beitrag zu entnehmen wären) sucht, wird mit "ein wenig Eigeninitiative" auf Basis der von Dir angebotenen Beispiele vermutlich nicht ganz so weit kommen ...
... was allerdings ein "Hallo" und die Verwendung der "Code"- angeht, bin ich bei Dir ...
Grüße
bastla
So unernst war die Frage gar nicht gemeint ...
Natürlich haben wir viele Threads mit ähnlichen Themen - aber wer nicht schon ein gewisses Maß an Scripting-Fähigkeiten mitbringt (und dass dem so wäre, hätte ich dem Eröffnungsposting nicht entnommen) und nur noch Details (wie sie zB diesem relativ aktuellen Beitrag zu entnehmen wären) sucht, wird mit "ein wenig Eigeninitiative" auf Basis der von Dir angebotenen Beispiele vermutlich nicht ganz so weit kommen ...
... was allerdings ein "Hallo" und die Verwendung der "Code"- angeht, bin ich bei Dir ...
Grüße
bastla
Hallo Zusammen,
hab mal etwas gebastelt (vielleicht ist es ja für irgendjemand nützlich). Für "test.svg"
*.vbs
Da mir einige Informationen fehlen, habe ich Processing Instructions und Attributes nach meinem eigenem Gusto festgelegt.
Grüße
rubberman
hab mal etwas gebastelt (vielleicht ist es ja für irgendjemand nützlich). Für "test.svg"
*.vbs
Set objXmlDoc = CreateObject("Microsoft.XMLDOM")
objXmlDoc.async = False
objXmlDoc.load("test.svg")
Set colNodes = objXMLDoc.documentElement.selectNodes("//g")
For Each objNode In colNodes
Set objXmlDoc2 = CreateObject("Microsoft.XMLDOM")
objXmlDoc2.async = False
Set objRoot2 = objXmlDoc2.CreateElement("svg")
objRoot2.setAttribute "xmlns", "http://www.w3.org/2000/svg"
objRoot2.setAttribute "xmlns:xlink", "http://www.w3.org/1999/xlink"
objRoot2.setAttribute "xmlns:ev", "http://www.w3.org/2001/xml-events"
objRoot2.setAttribute "version", "1.1"
objRoot2.setAttribute "baseProfile", "full"
objRoot2.text = vbCrLf & vbTab
objXmlDoc2.AppendChild(objRoot2)
Set objNode2 = objNode.cloneNode(True)
objXmlDoc2.documentElement.appendChild(objNode2)
Set objPI2 = objXmlDoc2.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
objXmlDoc2.InsertBefore objPI2, objXmlDoc2.ChildNodes(0)
objXmlDoc2.save(objNode.getAttribute("id") & ".svg")
Set objXmlDoc2 = Nothing
Next
Set objXmlDoc = Nothing
Grüße
rubberman
Hallo GIS2000,
ein paar Dinge aus dem SVG Standard sind offensichtlich mit DOM unvereinbar, namentlich die DOCTYPE Properties und die Ampersands in Zeile 9. Kein Problem, das lässt sich ignorieren.
Grüße
rubberman
ein paar Dinge aus dem SVG Standard sind offensichtlich mit DOM unvereinbar, namentlich die DOCTYPE Properties und die Ampersands in Zeile 9. Kein Problem, das lässt sich ignorieren.
Set objXmlDoc = CreateObject("Microsoft.XMLDOM")
objXmlDoc.async = False
objXmlDoc.validateOnParse = False
objXmlDoc.resolveExternals = False
objXmlDoc.load("test.svg")
Set colNodes = objXMLDoc.documentElement.selectNodes("//g")
For Each objNode In colNodes
Set objXmlDoc2 = CreateObject("Microsoft.XMLDOM")
objXmlDoc2.async = False
Set objRoot2 = objXmlDoc2.CreateElement("svg")
objRoot2.setAttribute "xmlns", "http://www.w3.org/2000/svg"
objRoot2.setAttribute "xmlns:xlink", "http://www.w3.org/1999/xlink"
objRoot2.setAttribute "version", "1.1"
objRoot2.setAttribute "baseProfile", "full"
objRoot2.text = vbCrLf & vbTab
objXmlDoc2.AppendChild(objRoot2)
Set objNode2 = objNode.cloneNode(True)
objXmlDoc2.documentElement.appendChild(objNode2)
Set objPI2 = objXmlDoc2.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""iso-8859-1""")
objXmlDoc2.InsertBefore objPI2, objXmlDoc2.ChildNodes(0)
objXmlDoc2.save(objNode.getAttribute("id") & ".svg")
Set objXmlDoc2 = Nothing
Next
Set objXmlDoc = Nothing
Grüße
rubberman
Hallo GIS2000,
das VBScript funktioniert nicht mit Bruchteilen einer SVG Datei. Mit einer vollständigen Datei (wie deinem Beispiel v. 16.08.) habe ich keinerlei Probleme gehabt.
Nachdem ich nun weiß, dass die g-Knoten auch Childknoten mit dem selben Namen haben können, würde ich aber das Script noch etwas anpassen.
Grüße
rubberman
das VBScript funktioniert nicht mit Bruchteilen einer SVG Datei. Mit einer vollständigen Datei (wie deinem Beispiel v. 16.08.) habe ich keinerlei Probleme gehabt.
Nachdem ich nun weiß, dass die g-Knoten auch Childknoten mit dem selben Namen haben können, würde ich aber das Script noch etwas anpassen.
Set objXmlDoc = CreateObject("Microsoft.XMLDOM")
objXmlDoc.async = False
objXmlDoc.validateOnParse = False
objXmlDoc.resolveExternals = False
objXmlDoc.load("test.svg")
Set colNodes = objXMLDoc.documentElement.selectNodes("//g")
For Each objNode In colNodes
If Not StrComp(objNode.parentNode.nodeName, "g", vbTextCompare) = 0 Then
Set objXmlDoc2 = CreateObject("Microsoft.XMLDOM")
objXmlDoc2.async = False
Set objRoot2 = objXmlDoc2.CreateElement("svg")
objRoot2.setAttribute "xmlns", "http://www.w3.org/2000/svg"
objRoot2.setAttribute "xmlns:xlink", "http://www.w3.org/1999/xlink"
objRoot2.setAttribute "version", "1.1"
objRoot2.setAttribute "baseProfile", "full"
objRoot2.text = vbCrLf & vbTab
objXmlDoc2.AppendChild(objRoot2)
Set objNode2 = objNode.cloneNode(True)
objXmlDoc2.documentElement.appendChild(objNode2)
Set objPI2 = objXmlDoc2.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""iso-8859-1""")
objXmlDoc2.InsertBefore objPI2, objXmlDoc2.ChildNodes(0)
objXmlDoc2.save(objNode.getAttribute("id") & ".svg")
Set objXmlDoc2 = Nothing
End If
Next
Set objXmlDoc = Nothing
Grüße
rubberman