xml auslesen und in Text Datei schreiben

bewusst

Lt. Junior Grade
Registriert
März 2007
Beiträge
350
Hallo,
möchte mit einer Batch Datei aus eine XML Datei folgendes suchen und den Wert auslesen.
Suchen: MeinWert
den dazugehörigen Wert: -3.20
In der Batch Datei möchte ich auch der Pfad der Quell Datei angeben und den Pfad der Ziel Datei.

und in eine Textdatei schreiben.
In der Textdatei soll es so wie folgt stehen:
aktuelles Datum+Zeit : MeinWert = -3.20
Der Wert könnte in der XML auch ohne minus stehen z.B. 5.3


Hier die XML:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<ObjectStore version="1.0" xmlns="x-schema:objectStore-schema.xml">
    <Object id="6" className="XMLRegValue">
        <utf8 name="name">MeinWert</utf8>
        <utf8 name="data">-3.20</utf8>
       <unsigned name="type">1</unsigned>
    </Object>
</ObjectStore>

Herzlichen Danke für eure Hilfe!
Gruß
 
Powershell quick'n'dirty...

PowerShell:
# XML Datei laden
$ovf = New-Object System.XML.XMLDocument
$ovf.Load("C:\test\test.xml")

# Datum abfragen und formatieren
$datum = Get-Date -Format g

# Ausgabe vorbereiten
$ausgabe = $datum + " : " + $ovf.ObjectStore.Object.utf8.InnerText[0] + " = " + $ovf.ObjectStore.Object.utf8.InnerText[1]

# an Datei anhängen
$ausgabe >> "C:\test\Ausgabe.txt"
 
Zuletzt bearbeitet: (nochmal schnell die Ausgabe angepasst)
  • Gefällt mir
Reaktionen: areiland
Hallo,
PHuV schrieb:
Das XML hat aber auch kein Kenner und Könner erstellt, oder?
die XML ist sehr lange und nur der Teil ist wichtigt daher habe ich sie für das Bsp. gekürzt.

@Rego:
Danke für dein Beispiel!
Teste es am späten Nachmittag!

Gruß
 
Hallo,
Rego schrieb:
diese Info wäre vielleicht vorher interessant gewesen...
sorry.

Was ich in der XML suche kommt nur einmal vor und der dazugehörige Wert auch nur ist der nicht immer gleich.
Sprich:
Suchen: MeinWert
den dazugehörigen Wert: -3.20
Dieser Teil existiert nur einmal in der XML Datei.

Verdammt, leider kann ich auf dem PC (Firma) keine Powershell Scripte laufen lassen!
Fehlermeldung:
"....kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist"

Habe jetzt in Erfahrung gebracht eine *.Bat Datei darf ich verwenden.

Daher würde ich deinen Script für eine *.bat benötigen nicht für Powershell *.ps1

Danke,
Gruß
 
Zuletzt bearbeitet:
Hallo,

erst einmal grüße ich alle. Ich bin ansonsten ein stiller Mitleser, aber manchmal packt es mich doch - wie in diesem Fall.

Ich kenne mich mit Batchdateien nicht so gut aus und ich glaube, dass das in dem Fall ganz schönes Gefrickel nötig wäre.

Aber ich habe einen anderen Lösungsansatz mit Python. Da ich nicht weiß, ob du lokale Adminrechte hast (Powershell-Rechte sind oft eine andere Geschichte), kannst du dir hier https://sourceforge.net/projects/portable- python/ eine Version herunterladen die du nicht installieren musst.

Im Unterordner App\Python liegt der Pythoninterpretor python.exe. Dieser interpretiert die Pythondatei. Eventuell kannst du den Ordner in deinen Benutzpfad anlegen oder vorher den Pfad auf der Konsole temporär anpassen (path=D.\Portable Python-3.7.4\App\Python;%path%) <- zum Beispiel. Das hat den Vorteil, dass du von jedem Ordner aus den Interpreter aufrufen kannst.

Kopiere deine XML-Datei MeineDatei.xml in den Ordner des Python-Interpreters python.exe (wenn das mit dem Pfad nicht klappen sollte) und erstelle dort eine Pythondatei XML-Parser.py mit dem Inhalt:

Python:
import datetime

fh = open('MeineDatei.xml')
line_number = 0
found = False
name_line = "" #<utf8 name="name">MeinWert</utf8>
data_line = "" #<utf8 name="data">-3.20</utf8>

# Gehe Zeile fuer Zeile durch
for line in fh:
    # print(line) <- Zum Testen
    result = line.find("<utf8 name=\"name\">MeinWert</utf8>")
    line_number +=1


    if found == True:
        data_line = line
        break

    if result > -1:
        name_line = line
        # Zeile mit name="name" gefunden
        # Naechste Zeile enthaelt name="data"
        found = True

fh.close()
# Ermitteln der Substring Positionen
# Position von der ersten spitzen schliessenden spitzen Klammer
pos1 = data_line.find(">")
pos1 +=1 #Inkrementieren
# Position vom schliessenden Tag
pos2 = data_line.find("</utf8>")
# Teil des data_string von pos1 bis pos2 extrahieren
data_substring = data_line[pos1:pos2]

# Dieselbe Prozedur um MeinWert zu extrahieren
pos1 = name_line.find(">")
pos1 +=1
pos2 = name_line.find("</utf8>")
name_substring = name_line[pos1:pos2]

print(name_substring)
print(data_substring)


cur_dt1 = datetime.datetime.today()
# Formatieren nach Muster
#d = Tag, m = Monat, y = Jahr, H = Stunde, M = Minute, S = Sekunde
dt_str1 = '{:%d/%m/%y %H:%M %S}'.format(cur_dt1)
print(dt_str1)

file = open("output.txt","w")
line_to_write = dt_str1 + " : " + name_substring+ " = " + data_substring
file.write(line_to_write)
file.close()

Wenn ich diese Datei aufrufe, bekomme ich folgenden Output:

Code:
c:\Users\Sebastian\Downloads\Portable Python-3.7.4\App\Python>python XML-Parser.py
MeinWert
-3.20
10/10/19 01:03 10

c:\Users\Sebastian\Downloads\Portable Python-3.7.4\App\Python>

Dies sind die Print-Anweisungen aus dem Quellcode. Schau im selben Ordner nach, in der dein Script liegt. Dort sollte dann eine Datei output.txt mit einer Zeile (10/10/19 00:47 23 : MeinWert = -3.20) liegen.

Einzige Bedingung die gelten muss, ist das die Zeilen direkt untereinander sind, da ansonsten wohl Murks herauskommt. Zudem muss die Funktion find auch fündig werden. Nach dem ersten Fund, bricht das Script das Parsen ab.

Ich weiß, dass man unter Python recht easy ist, XML zu lesen. Bin mir jedoch nicht sicher, ob das man das dann über pip erst herunterladen muss (Problem mit Proxy, usw). Und da ich Python-Anfänger bin wollte ich einfach etwas üben. Mein Steckenpferd ist normalerweise Qt/C++. Eine kompilierte exe war ja nicht gefragt und man hat es unter Qt/C++ nicht so leicht schnell mal den Code anzupassen und schnell laufen zu lassen.

Hoffe geholfen zu haben. Vielleicht kommt ja noch die eine oder andere Frage. Gute N8! :)
 

Anhänge

  • 2019-10-10 01_17_58-XML-Parser.py - Visual Studio Code.png
    2019-10-10 01_17_58-XML-Parser.py - Visual Studio Code.png
    111,7 KB · Aufrufe: 373
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: bewusst
Hallo Xonical!
Erstmals Danke für deine Unterstützung oder besser den kompletten Code!

Bin auch schon am arbeiten und habe schon die ersten Porbleme mit unserer IT im Haus.
Darf es nicht verwenden, oh Mann bin ich sauer....

Lt. IT darf ich nur eben eine Bat Datei verwenden...
Ich glaube ich gebe auf und kopiere mir täglich diese Datein zusammen.

Danke nochmals👍
Gruß
 
Das ist natürlich mehr als ärgerlich. Ich verstehe die Philosophie solcher Firmen in der Hinsicht nicht. Sicherheit, klar. Ein ganz wichtiger Punkt. Aber gegen eine portable Version was haben. Die nirgendwo was reinschreibt und keine Adminrechte braucht und auch recht renommiert ist (also Python). Wie soll man was lösen, wenn einem die Hände gebunden sind...

Mir ist ein kleiner Fehler in Zeile 12 aufgefallen.

Streiche:
"<utf8 name=\"name\">MeinWert</utf8>"

Setze:
"<utf8 name=\"name\">

Ansonsten wäre das Ergebnis nicht variabel in Bezug auf den Inhalt des Tags.

Wäre bei euch eine kleine kompilierte exe (ohne Adminrechte) erlaubt die man über die Konsole ausführen kann?

Dann würde ich das ganze in C++ machen. Aufruf wäre dann: XML.exe "meineDatei.xml" "output.txt"

Den Quellcode würde ich natürlich auch veröffentlichen, falls selber kompiliert werden möchte.
 
genau für sowas ist doch die PowerShell...
Da kann kein Admin was dagegeben haben. Wenn Dir die Kommandozeile erlaubt wird, dann muss Dir auch die PowerShell erlaubt sein...
 
Bei uns am Institut ist die PowerShell auch über eine Gruppenrichtlinie gesperrt. Hätte mir auch ein paar mal geholfen, Zugriff darauf zu haben. Man findet recht viele kleine Helferlein die in (der) PowerShell implementiert sind.
 
es stellt sich nur die Frage "Warum?"
dass man "Python" nicht runterladen darf, kann ich ja noch irgendwo argumentieren, aber die cmd offen lassen und PowerShell verbieten?
würde ich einfach mal vermuten, da haben sich die Admins bis jetzt noch nie mit der PowerShell beschäftigt und deswegen sperren sie die
 
Hier gibt eben aus Sicherheitsgründen solche Maßnahmen in diversen Firmen. Da können durchaus diverse gesetztliche Vorgaben vorliegen, die unsereiner nicht ersichtlich sind. Ebenso gibt es sehr wohl auch konkrete Vorfälle, die zu solchen Maßnahmen führen. Daher, nicht aufregen, Fakten hinlegen, Arbeitszeit berechnen und eventuell Ausnahmen beantragen.
 
Hallo an alle Helfenden!
Nun habe ich von unserer IT eine funktionierende *.bat Datei bekommen!
Am Montag frage ich nach ob ich sie hier posten darf (ich glaube JA) dann stelle
ich sie hier rein damit andere die ähnliches suchen eine Vorlage haben.

Danke euch und bis Montag,
Gruß

P.S. @ PHuV
du hast mit deinem Beitrag ins schwarze getroffen, bei uns gibt es tatsächlich eine
gesetzliche Vorgabe!
 
Gesetzliche Vorgaben, die cmd erlauben und Powershell verbieten? Ich arbeite auch im „Gov“-Bereich, aber sowas ist mir unbekannt.
 
Hallo Rego,
selber kann ich es auch nicht verstehen...;)

So hier der Code für die *.bat Datei.
Code:
@echo off
set XMLPfad="C:\irgend_ein_pfad\CB.xml"

find /N "<utf8 name="name">MeinWert</utf8>" %XMLPfad%

set /a ZeileA=0
set /a ZeileB=0

for /F "skip=2 delims=[] tokens=1" %%a in ('find /N "<utf8 name="name">MeinWert</utf8>" %XMLPfad%') do set /a ZeileB=%%a

set /a ZeileA=ZeileB-1

set "WertA="
set "WertB="
set "WertX="
set "Filedatum="

for /f "delims=<> tokens=3" %%a in ('more/e +%ZeileA% ^< %XMLPfad%') do (
    if not defined WertA set "WertA=%%a"
    )
 
for /f "delims=<> tokens=3" %%a in ('more/e +%ZeileB% ^< %XMLPfad%') do (
    if not defined WertB set "WertB=%%a"
    )


for /f %%a in (%XMLPfad%) do if not defined Filedatum set "Filedatum=%%~ta"
 
Echo PC:%computername% Datum:%date% Zeit:%time%: "%WertA%" = %WertB% >>MeinWert.txt

Die dazugehörige xml Datei ist im ersten Posting...
Gruß
 
  • Gefällt mir
Reaktionen: Xonical
Rego schrieb:
Gesetzliche Vorgaben, die cmd erlauben und Powershell verbieten ... sowas ist mir unbekannt.
Häufig ist genau das "erlaubt", was der lokale Admin versteht.
 
  • Gefällt mir
Reaktionen: Rego
bewusst schrieb:
P.S. @ PHuV
du hast mit deinem Beitrag ins schwarze getroffen, bei uns gibt es tatsächlich eine
gesetzliche Vorgabe!
Bin ja oft genug als Externer bei solchen Läden unterwegs, ich kenne Dein Leid allzugut.
Rego schrieb:
Gesetzliche Vorgaben, die cmd erlauben und Powershell verbieten? Ich arbeite auch im „Gov“-Bereich, aber sowas ist mir unbekannt.
Banken, diverse Minsterien... Ist halt so, was soll man machen.
blöderidiot schrieb:
Häufig ist genau das "erlaubt", was der lokale Admin versteht.
Nein, das trifft es nicht. Daher, laßt das Spekulieren warum und wieso und wie genau. Wie gewagt, es gibt hier klare Vorgaben, die Euch nicht ersichtlich sind, wenn Ihr hier nicht involviert seid.
 
Zurück
Oben