Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Inhalt einer XML Datei per Batch bzw. Script ändern

Frage Entwicklung Batch & Shell

Mitglied: twin850

twin850 (Level 1) - Jetzt verbinden

06.08.2011 um 00:14 Uhr, 14054 Aufrufe, 33 Kommentare

Hallo zusammen,

ich versuche mich schon seit mehreren Tagen an der Lösung untenstehenden Problems komme aber leider nicht weiter. Diverse Versuche aufgrund ähnlicher Threads scheitertern kläglich. Ich hoffe daher auf Eure Hilfe. Bin absoluter Script Novize.

Ich bekomme taeglich mehrere XML Dateien geliefert welche in ein Warenwirtschaftssystem eingelesen werden sollen.

Leider kann ich das WAWI Programm nicht dazu bringen alle für mich wichtigen Inhalte der XML Datei zu verarbeiten. Das gelieferte XML Format lässt sich durch den Lieferer leider nicht ändern. (IPad APP)

Es muss demzufolge der Inhalt der XML in mindestens zwei Bereichen geändert werden damit ich sie komplett verarbeiten kann.

1. Der Inhalt zwischen <arbeiten></arbeiten> in Zeile 11-13 sollte den wert zwischen <arbeitszeitBeginn></arbeitszeitBeginn> in Zeile 50 ersetzen. Die dortigen Werte sind für mich unwichtig, den datensatz kann ich aber dann entsprechend zuordnen. Schön wäre, wenn die Zeilenumbrüche erhalten bleiben, ist aber nicht zwingend.

2. Bei dem Wert zwischen <arbeitszeit></arbeitszeit> in Zeile 49 muß das "h" weg.

3. Ein fester Wert z.B. 1050 sollte den Wert zwischen <arbeitszeitEnde></arbeitszeitEnde> in Zeile 51 ersetzen.

4. Schön wäre, wenn das script alle XML Dateien die in einem bestimmten Verzeichniss liegen entsprechend abarbeitet.

Mit den Zeilennummern kann in dem Script nicht gearbeitet werden da sie variieren.

So sieht die gelieferte XML datei aus:

01.
  
02.
<?xml version="1.0" encoding="UTF-8"?> 
03.
<stundenbericht> 
04.
  <rechnungsadresse>10101 
05.
Testvorname Testnachnme 
06.
Teststrasse 11 
07.
12345 Testort 
08.
Deutschland</rechnungsadresse> 
09.
  <ausfuehrungsort/> 
10.
  <berichtNr>14</berichtNr> 
11.
  <arbeiten>Leistung 1 
12.
Leistung 2 
13.
Leistung 3</arbeiten> 
14.
  <material/> 
15.
  <materialeintrag> 
16.
    <bezeichnung>Testartikel</bezeichnung> 
17.
    <artikelnr>12345</artikelnr> 
18.
    <menge>1</menge> 
19.
    <verpackungseinheit/> 
20.
    <einzelpreis/> 
21.
    <gesamtpreis>0,00</gesamtpreis> 
22.
  </materialeintrag> 
23.
  <materialeintrag> 
24.
    <bezeichnung>Testartikel2</bezeichnung> 
25.
    <artikelnr>12346</artikelnr> 
26.
    <menge>1</menge> 
27.
    <verpackungseinheit/> 
28.
    <einzelpreis/> 
29.
    <gesamtpreis>0,00</gesamtpreis> 
30.
  </materialeintrag> 
31.
  <materialeintrag> 
32.
    <bezeichnung>Testartikel3</bezeichnung> 
33.
    <artikelnr>12347</artikelnr> 
34.
    <menge>1</menge> 
35.
    <verpackungseinheit/> 
36.
    <einzelpreis/> 
37.
    <gesamtpreis>0,00</gesamtpreis> 
38.
  </materialeintrag> 
39.
  <gesamtpreisNetto>0,00</gesamtpreisNetto> 
40.
  <steuer>0,00</steuer> 
41.
  <gesamtpreisBrutto>0,00</gesamtpreisBrutto> 
42.
  <datum>05.08.11</datum> 
43.
  <taetigkeit> 
44.
    <datum>05.08.11</datum> 
45.
    <fahrzeit/> 
46.
    <fahrzeitAbfahrt/> 
47.
    <fahrzeitAnkunft/> 
48.
    <fahrstrecke/> 
49.
    <arbeitszeit>0,75h</arbeitszeit> 
50.
    <arbeitszeitBeginn>23:05</arbeitszeitBeginn> 
51.
    <arbeitszeitEnde>23:50</arbeitszeitEnde> 
52.
    <pausenzeit/> 
53.
    <pausenzeitBeginn/> 
54.
    <pausenzeitEnde/> 
55.
    <pausenzeit2/> 
56.
    <pausenzeit2Beginn/> 
57.
    <pausenzeit2Ende/> 
58.
    <name/> 
59.
  </taetigkeit> 
60.
  <auswahllisteBezeichnung1>Pos</auswahllisteBezeichnung1> 
61.
  <auswahleintrag1/> 
62.
  <unterzeichner/> 
63.
</stundenbericht> 
64.
 
Ich hoffe es kann mir jemand weiterhelfen.
33 Antworten
Mitglied: Friemler
06.08.2011 um 01:29 Uhr
Hallo twin850,

Deine XML-Datei ist laut Header in der Codierung UTF-8 gespeichert. Solange keine Umlaute (äöüßÄÖÜ) oder andere Zeichen mit einem Code größer 127 in den Daten vorkommen (kannst Du das garantieren?), ließe sich das ganze noch mit Batchscript verarbeiten, die Aufgabe mit Batchscript zu lösen ist aber umständlich. Dazu wäre VBScript viel besser geeignet. Damit lassen sich aber nur Unicode-Dateien in der Codierung UTF-16 Little Endian verarbeiten.

Du solltest zuerstmal klären, ob die iPad-App die Datei auch als UTF-16 LE oder ANSI (Codepage 1252) codieren kann, bevor wir hier Code für die Tonne produzieren.

Gruß
Friemler
Bitte warten ..
Mitglied: twin850
06.08.2011 um 01:51 Uhr
Hallo Friemler,

danke für die Antwort zu später Stunde. Irgendwie sind wir alle Leidensgenossen was die Arbeitszeiten angeht.

Die gelieferten XML Dateien sind so wie sie sind. Habe schon Kontakt mit dem Hersteller der APP aufgenommen aber da lässt sich wohl nichts machen.

Hauptsächlich sind die von mir benötigten Daten numerisch. (Kundennummer, Artikelnummer u.s.w.) Es werden zwar auch diverse Texte in die XML mit übergeben (z.B. Name und Anschrift), diese werte ich aber gar nicht aus. Von daher wäre es nicht schlimm wenn die Umlaute verloren oder zerhauen werden.

Als ich die Tage selbst mit VB herumexperimentiert habe hatte ich aber keine Probleme mit der Codierung. (Zumindestens keine Fehlermeldungen die auf ein Problem mit der Codierung hindeuten.) Kann es sein, das die Angabe im Header nicht mit der echten Codierung übereinstimmt ?

Gruß
twin850
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 02:10 Uhr
Hallo twin850,

war evtl. missverständlich ausgedrückt: VBScript kann außer Unicode-Dateien natürlich auch ANSI-Dateien (Codepage 1252) korrekt verarbeiten. Die Zeichencodes zwischen 32 (Leerzeichen) und 127 sind sowohl in ASCII, ANSI und UTF-8 gleich.

Warum Du keine Probleme bei Deinen Experimenten hattest, könnte entweder daran liegen, dass die Codierung im Header tatsächlich falsch angegeben ist und das ganze eine ANSI-Datei ist, oder sie wurde in UTF-8 codiert aber ohne Byte Order Mark (BOM) geschrieben. Die BOM wird in die ersten 3 Bytes einer UTF-8-Datei geschrieben, die die Werte EF BB BF (hexadezimal) haben. Das könntest Du mit einem Hex-Editor oder dem Befehl type "NameDerXMLDatei" prüfen. Wenn die ersten drei Zeichen der ersten Zeile irgendwelche seltsamen Zeichen sind, hat die Datei eine BOM.

Gruß
Friemler
Bitte warten ..
Mitglied: twin850
06.08.2011 um 02:22 Uhr
Hallo Friemler,

ich sehe schon ich wäre mit meinem (Un)Wissen völlig untergegangen.

So sieht der Anfang der . xml Datei aus. Auch mit type konnte ich keine seltsamen Zeichen erkennen.

01.
3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C7374756E64656E626572696368743E0A
Gruß
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 12:12 Uhr
Moin twin850,

teste mal folgendes:
01.
Const ForReading = 1 
02.
Const AsASCII    = 0 
03.
 
04.
 
05.
strFixedValue = "1050" 
06.
 
07.
 
08.
If WScript.Arguments.Count > 0 Then 
09.
  Set objFSO = CreateObject("Scripting.FileSystemObject") 
10.
 
11.
  strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
12.
  If WScript.Arguments.Count > 1 Then strFixedValue = WScript.Arguments(1) 
13.
 
14.
  If objFSO.FolderExists(strSrcDir) Then 
15.
    Set objRegExp        = New RegExp 
16.
    objRegExp.Global     = False 
17.
    objRegExp.IgnoreCase = True 
18.
 
19.
    For Each objFile In objFSO.GetFolder(strSrcDir).Files 
20.
      If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then 
21.
        'Eingabedatei lesen 
22.
        Set objInFile = objFile.OpenAsTextStream(ForReading, AsASCII) 
23.
        strContent    = objInFile.ReadAll 
24.
        objInFile.Close 
25.
 
26.
 
27.
        'Den Wert zwischen <arbeitszeitBeginn></arbeitszeitBeginn> 
28.
        'durch den Wert zwischen <arbeiten></arbeiten> ersetzen 
29.
        objRegExp.Pattern = "<arbeiten>" 
30.
        Set colMatch1     = objRegExp.Execute(strContent) 
31.
 
32.
        objRegExp.Pattern = "</arbeiten>" 
33.
        Set colMatch2     = objRegExp.Execute(strContent) 
34.
 
35.
        If (colMatch1.Count > 0) And (colMatch2.Count > 0) Then 
36.
          intKeyValueStart  = colMatch1(0).FirstIndex + 1 + colMatch1(0).Length 
37.
          intKeyValueLen    = colMatch2(0).FirstIndex + 1 - intKeyValueStart 
38.
          strReplace        = Mid(strContent, intKeyValueStart, intKeyValueLen) 
39.
 
40.
          objRegExp.Pattern = "(<arbeitszeitBeginn>).*(</arbeitszeitBeginn>)" 
41.
          strContent = objRegExp.Replace(strContent, "$1" & strReplace & "$2") 
42.
        End If 
43.
 
44.
 
45.
        'Das h bei dem Wert zwischen <arbeitszeit></arbeitszeit> entfernen 
46.
        objRegExp.Pattern = "(<arbeitszeit>)([0-9,]{1,}).{1,}(</arbeitszeit>)" 
47.
        strContent = objRegExp.Replace(strContent, "$1$2$3") 
48.
 
49.
 
50.
        'Den Wert zwischen <arbeitszeitEnde></arbeitszeitEnde> 
51.
        'durch einen fixen Wert ersetzen 
52.
        objRegExp.Pattern = "(<arbeitszeitEnde>).*(</arbeitszeitEnde>)" 
53.
        strContent = objRegExp.Replace(strContent, "$1" & strFixedValue & "$2") 
54.
 
55.
 
56.
        'Ausgabedaei schreiben 
57.
        Set objOutFile = objFSO.CreateTextFile(objFSO.BuildPath(strSrcDir, objFSO.GetBaseName(objFile.Name) & "_Neu." & objFSO.GetExtensionName(objFile.Name)), True) 
58.
        objOutFile.Write strContent 
59.
        objOutFile.Close 
60.
      End If 
61.
    Next 
62.
  End If 
63.
End If
Das Script z.B. als Replace.vbs speichern.

Aufruf
Du kannst in Zeile 5 den festen Wert vorgeben, der in Zeile 51 der (Beispiel-)XML-Datei eingefügt werden soll, und das Icon des Verzeichnisses, das die XML-Dateien enthält, per Drag&Drop auf das Icon des Scripts ziehen

oder

das Script folgendermaßen aufrufen
cscript /nologo "Replace.vbs" "PfadDesVerzeichnissesMitDenXMLDateien"
oder

das Script folgendermaßen aufrufen
cscript /nologo "Replace.vbs" "PfadDesVerzeichnissesMitDenXMLDateien" "FixerWert"
In diesem Fall wird der Fixwert aus der Befehlszeile verwendet, auch wenn im Scriptcode ein anderer Wert gesetzt ist.


Es wird im selben Verzeichnis, in dem die Eingabedateien liegen, für jede Eingabedatei eine neue Ausgabedatei erzeugt, deren Namen um _Neu ergänzt wurden (aus z.B. Datei.xml wird Datei_Neu.xml).

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
06.08.2011 um 12:43 Uhr
Hallo twin850 und willkommen im Forum, hallo Friemler!

Mit etwas Verspätung (und nur mal zum Testen für eine einzelne Datei) mein (nicht unähnlicher ) Ansatz:
01.
Ein = "D:\Test.xml" 
02.
Aus = "D:\Korrigiert.xml" 
03.
FestWert = "1050" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set rE = New RegExp 
07.
 
08.
T = fso.OpenTextFile(Ein).ReadAll 
09.
 
10.
rE.Pattern = "<arbeiten>([\S\s]+)</arbeiten>" 
11.
 
12.
Set Matches = rE.Execute(T) 
13.
If Matches.Count = 0 Then  
14.
    WScript.Echo "Leistungsdaten nicht gefunden!" 
15.
    WScript.Quit(1) 
16.
End If 
17.
 
18.
Wert = Matches(0).SubMatches(0) 
19.
 
20.
rE.Pattern = "<arbeitszeitBeginn>.*</arbeitszeitBeginn>" 
21.
T = rE.Replace(T, "<arbeitszeitBeginn>" & Wert & "</arbeitszeitBeginn>") 
22.
 
23.
rE.Pattern = "(<arbeitszeit>[^h]*)(h)(</arbeitszeit>)" 
24.
T = rE.Replace(T, "$1$3") 
25.
 
26.
rE.Pattern = "<arbeitszeitEnde>.*</arbeitszeitEnde>" 
27.
T = rE.Replace (T, "<arbeitszeitEnde>" & FestWert & "</arbeitszeitEnde>") 
28.
 
29.
fso.CreateTextFile(Aus).Write T
Im Zweifelsfall würde ich nur Quell- und Zieldateinamen als Parameter übernehmen und das Abarbeiten aller Dateien einem Batch überlassen ...

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
06.08.2011 um 12:55 Uhr
Hallo Zusammen.

Windows stellt doch extra zur Verarbeitung von XML Dateien ein ActiveX-Object zur Verfügung.
Für eine einzelne XML-Datei namens "test.xml" könnte das ganze dann so aussehen:
01.
Const strXmlDoc = "test.xml" 
02.
 
03.
Set objXmlDoc = CreateObject("Microsoft.XMLDOM") 
04.
objXmlDoc.async = False 
05.
objXmlDoc.load(strXmlDoc) 
06.
 
07.
Set objNode1 = objXmlDoc.documentElement.SelectSingleNode("//arbeiten") 
08.
If objNode1 Is Nothing Then 
09.
  MsgBox "Der Knoten ""arbeiten"" wurde nicht gefunden!", vbCritical, "Fehler" 
10.
  WScript.Quit 1 
11.
End If 
12.
 
13.
Set objNode2 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitBeginn") 
14.
If objNode2 Is Nothing Then 
15.
  MsgBox "Der Knoten ""arbeitszeitBeginn"" wurde nicht gefunden!", vbCritical, "Fehler" 
16.
  WScript.Quit 1 
17.
End If 
18.
 
19.
objNode2.text = objNode1.text 
20.
 
21.
Set objNode3 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeit") 
22.
If objNode3 Is Nothing Then 
23.
  MsgBox "Der Knoten ""arbeitszeit"" wurde nicht gefunden!", vbCritical, "Fehler" 
24.
  WScript.Quit 1 
25.
End If 
26.
 
27.
strArbeitszeit = objNode3.text 
28.
objNode3.text = Left(strArbeitszeit, Len(strArbeitszeit) - 1) 
29.
 
30.
Set objNode4 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitEnde") 
31.
If objNode4 Is Nothing Then 
32.
  MsgBox "Der Knoten ""arbeitszeitEnde"" wurde nicht gefunden!", vbCritical, "Fehler" 
33.
  WScript.Quit 1 
34.
End If 
35.
 
36.
objNode4.text = "1050" 
37.
 
38.
objXmlDoc.save(strXmlDoc) 
39.
Set objXmlDoc = Nothing
Wenn es so funktioniert, ist die Massenverarbeitung aller XML Dateien in einem Verzeichnis nur noch Makulatur.

Grüße
rubberman

<EDIT: bastlas Vorschlag berücksichtigt. />
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 12:57 Uhr
Hallo bastla,

ah, so ([\S\s]+) funktioniert das also mit dem Multiline-Match. Danke.

Gruß
Friemler
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 13:24 Uhr
[OT]

Hallo Rubberman,

gibt es eine Möglichkeit, alle auf einem System verfügbaren ActiveX-Objekte und die darin enthaltenen Klassen in Erfahrung zu bringen (per Script/Programm, Seite mit einer Liste, ...)?

Gruß
Friemler

[/OT]
Bitte warten ..
Mitglied: bastla
06.08.2011 um 13:51 Uhr
Hallo rubberman!

Ist natürlich die wesentlich bessere Lösung ...
Zeile 8 (und analog 14, 22 und 31) sollte sich übrigens auf
If objNode1 Is Nothing Then
reduzieren lassen ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
06.08.2011 um 13:54 Uhr
Hallo Friemler!

Ich hatte Deine Lösung erst beim Posten meines Ansatzes gesehen - so gesehen hatte es dann aber trotzdem etwas Sinn, auch meine Variante anzubieten ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 14:00 Uhr
Hallo bastla,

Zitat von bastla:
so gesehen hatte es dann aber trotzdem etwas Sinn, auch meine Variante anzubieten ...

klar, das macht immer Sinn, so kann man ja voneinander lernen.

Gruß
Friemler
Bitte warten ..
Mitglied: rubberman
06.08.2011 um 14:05 Uhr
Hallo bastla,

völlig korrekt. In einem Moment geistiger Umnachtung hatte ich mit
If objNode1 = Nothing Then
experimentiert, was bei Objekten natürlich nie funktionieren kann.

Werde oben korrigieren.

Danke und Grüße
rubberman
Bitte warten ..
Mitglied: rubberman
06.08.2011 um 14:12 Uhr
Hallo Friemler,

eine Liste mit allen ActiveX Objekten und Ihrer Referenz würde vermutlich den Rahmen sprengen. Letztlich findest du eine solche Liste aber in der Registry.
Schau mal hier. Die Referenzen dazu findest du dann sicher im MSDN.

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
06.08.2011 um 14:17 Uhr
Hallo Rubberman,

vielen Dank für den Tipp.

Die Referenzen dazu findest du dann sicher im MSDN.
Genauso habe ich mir das auch gedacht.

Gruß
Friemler
Bitte warten ..
Mitglied: twin850
06.08.2011 um 21:01 Uhr
Hallo zusammen,

was soll ich sagen, alle drei Vorschläge funktionieren einwandfrei und ich habe nun ein Luxusproblem. Welches Script nehme ich ?.

Friemlers Script ist ja fix und fertig da schon alle Dateien in einem Verzeichniss verarbeitet werden.

Ich werd noch ein bisschen testen und auch die Weiterverarbeitung der geänderten XML Dateien überprüfen.

Im Moment bleibt nur ein große D A N K E an alle.
Bitte warten ..
Mitglied: bastla
06.08.2011 um 21:56 Uhr
Hallo twin850!

Du brauchst ja die Version von rubberman nur ein wenig zu ergänzen, etwa so:
01.
'XML_bearbeiten 
02.
If WScript.Arguments.Count = 0 Then 
03.
    MsgBox "Keine Datei übergeben!", vbCritical, "Fehler" 
04.
    WScript.Quit 2 
05.
End If 
06.
 
07.
strXmlDoc = WScript.Arguments(0) 
08.
 
09.
Set objXmlDoc = CreateObject("Microsoft.XMLDOM") 
10.
objXmlDoc.async = False 
11.
objXmlDoc.load(strXmlDoc) 
12.
 
13.
Set objNode1 = objXmlDoc.documentElement.SelectSingleNode("//arbeiten") 
14.
If objNode1 Is Nothing Then 
15.
  MsgBox "Der Knoten ""arbeiten"" wurde nicht gefunden!", vbCritical, "Fehler" 
16.
  WScript.Quit 1 
17.
End If 
18.
 
19.
Set objNode2 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitBeginn") 
20.
If objNode2 Is Nothing Then 
21.
  MsgBox "Der Knoten ""arbeitszeitBeginn"" wurde nicht gefunden!", vbCritical, "Fehler" 
22.
  WScript.Quit 1 
23.
End If 
24.
 
25.
objNode2.text = objNode1.text 
26.
 
27.
Set objNode3 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeit") 
28.
If objNode3 Is Nothing Then 
29.
  MsgBox "Der Knoten ""arbeitszeit"" wurde nicht gefunden!", vbCritical, "Fehler" 
30.
  WScript.Quit 1 
31.
End If 
32.
 
33.
strArbeitszeit = objNode3.text 
34.
objNode3.text = Left(strArbeitszeit, Len(strArbeitszeit) - 1) 
35.
 
36.
Set objNode4 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitEnde") 
37.
If objNode4 Is Nothing Then 
38.
  MsgBox "Der Knoten ""arbeitszeitEnde"" wurde nicht gefunden!", vbCritical, "Fehler" 
39.
  WScript.Quit 1 
40.
End If 
41.
 
42.
objNode4.text = "1050" 
43.
 
44.
objXmlDoc.save(strXmlDoc) 
45.
Set objXmlDoc = Nothing
und kannst sie dann per Batch wie folgt verwenden:
01.
@echo off & setlocal 
02.
set "Verzeichnis=D:\XML" 
03.
set "Script=D:\XML_bearbeiten.vbs" 
04.
set "Fehler=%Verzeichnis%\Fehler.txt" 
05.
 
06.
pushd "%Verzeichnis%" 
07.
del "%Fehler%" 
08.
for /f "delims=" %%i in ('dir /b /a-d *.xml') do ( 
09.
    copy "%%i" *.bak 
10.
    echo Bearbeite: %%i 
11.
    cscript //nologo "Script%" "%%i" || ( 
12.
        move "%%~ni.bak" *.xml 
13.
        echo Fehler! 
14.
        >>"%Fehler%" echo %%i 
15.
    )  
16.
    echo\ 
17.
18.
if exist "%Fehler%" notepad "%Fehler%" 
19.
popd
Anmerkungen:
Beides ungetestet

Wenn's "unattended" laufen soll, die Zeilen der Art
MsgBox "Der Knoten ""arbeitszeitBeginn"" wurde nicht gefunden!", vbCritical, "Fehler"
entweder auf
WScript.Echo "Der Knoten ""arbeitszeitBeginn"" wurde nicht gefunden!"
ändern oder durch ein vorangestelltes REM auskommentieren - die Dateien mit Fehler werden auf jeden Fall in der "Fehler.txt" protokolliert (und in der aktuellen Version auch durch die vorher erstellte Sicherungskopie ersetzt) ...

Grüße
bastla

[Edit] Gegen Fehler durch automatisches Wiederherstellen der Sicherungskopie zusätzlich abgesichert - ist aber eigentlich unnötig, da ja Änderungen ohnehin nur geschrieben werden, wenn das Script fehlerfrei durchläuft ... [/Edit]
Bitte warten ..
Mitglied: rubberman
06.08.2011 um 22:14 Uhr
Hallo twin850, hallo bastla.

Ich würde dann, wie von Friemler vorgeschlagen, die Verarbeitung des Verzeichnisses auch im VBScript vornehmen, da der wiederholte Aufruf des Scripts eine Menge Zeit frisst.
Ungetestet:
01.
If WScript.Arguments.Count < 1 Then 
02.
  WScript.Echo "Syntax:" & _ 
03.
    vbLf & "cscript //nologo """ & WScript.ScriptName & """ ""Pfad"" [""FixerWert""]" & _ 
04.
    vbLf & vbLF & "Returncodes:" & _ 
05.
    vbLf & "3  zu wenig Argumente" & _ 
06.
    vbLf & "2  Verzeichnis nicht gefunden" & _ 
07.
    vbLf & "1  eine oder Mehrere Dateien konnten nicht verarbeitet werden" & _ 
08.
    vbLf & "0  alle gefundenen Dateien erfolgreich verarbeitet" & vbLf     
09.
  WScript.Quit 3 
10.
End If 
11.
 
12.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
13.
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
14.
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 2 
15.
 
16.
If WScript.Arguments.Count > 1 Then 
17.
  strFixedValue = WScript.Arguments(1) 
18.
Else 
19.
  strFixedValue = "1050" 
20.
End If 
21.
 
22.
iSucc = 0 
23.
iErr = 0 
24.
For Each objFile In objFSO.GetFolder(strSrcDir).Files 
25.
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then 
26.
    If Process_XML(objFile.Path) Then 
27.
      WScript.Echo """" & objFile.Name & """ - Verarbeitung erfolgreich." 
28.
      iSucc = iSucc + 1 
29.
    Else 
30.
      WScript.Echo """" & objFile.Name & """ - Verarbeitung fehlgeschlagen." 
31.
      iErr = iErr + 1 
32.
    End If 
33.
  End If 
34.
Next 
35.
WScript.Echo vbLf & iSucc + iErr & " Dateien verarbeitet." & _ 
36.
  vbLf & iSucc & " erfolreich" & _ 
37.
  vbLf & iErr & " fehlgeschlagen" & vbLf 
38.
If iErr > 0 Then WScript.Quit 1 
39.
 
40.
 
41.
Function Process_XML(ByRef strXmlDoc) 
42.
    Set objXmlDoc = CreateObject("Microsoft.XMLDOM") 
43.
    objXmlDoc.async = False 
44.
    objXmlDoc.load(strXmlDoc) 
45.
 
46.
    Set objNode1 = objXmlDoc.documentElement.SelectSingleNode("//arbeiten") 
47.
    If objNode1 Is Nothing Then 
48.
      Process_XML = False 
49.
      Exit Function 
50.
    End If 
51.
 
52.
    Set objNode2 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitBeginn") 
53.
    If objNode2 Is Nothing Then 
54.
      Process_XML = False 
55.
      Exit Function 
56.
    End If 
57.
 
58.
    objNode2.text = objNode1.text 
59.
 
60.
    Set objNode3 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeit") 
61.
    If objNode3 Is Nothing Then 
62.
      Process_XML = False 
63.
      Exit Function 
64.
    End If 
65.
 
66.
    strArbeitszeit = objNode3.text 
67.
    objNode3.text = Left(strArbeitszeit, Len(strArbeitszeit) - 1) 
68.
 
69.
    Set objNode4 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitEnde") 
70.
    If objNode4 Is Nothing Then 
71.
      Process_XML = False 
72.
      Exit Function 
73.
    End If 
74.
 
75.
    objNode4.text = strFixedValue 
76.
 
77.
    objXmlDoc.save(strXmlDoc) 
78.
    Set objXmlDoc = Nothing 
79.
 
80.
    Process_XML = True 
81.
End Function
Grüße
rubberman
Bitte warten ..
Mitglied: twin850
08.08.2011 um 12:22 Uhr
Hallo Rubbermann, bastla, Friemler,

nachdem ich das WE rumexperimentiert habe, habe ich mich grundsätzlich für die Variante von rubbermann entschieden da ich das Script am ehesten verstehe und selbst Anpassungen vornehmen konnte was in Zukunft evtl. hilfreich ist.

@Friemler
Trotzdem DANKE. Auch Deine Variante geht.

@Rubbermann
Ich habe das Script um einen weiteren Eintrag ergänzt.

01.
Set objNode5 = objXmlDoc.documentElement.SelectSingleNode("//rechnungsadresse") 
02.
If objNode5 Is Nothing Then 
03.
   MsgBox "Der Knoten ""Rechnungsadresse"" wurde nicht gefunden!", vbCritical, "Fehler" 
04.
   WScript.Quit 1 
05.
End If 
06.
 
07.
strrechnungsadresse = objNode5.text 
08.
objNode5.text = Left(strrechnungsadresse,5)
Damit wird der Wert Rechungsadresse auf 5 Stellen gekürzt (Das ist die Kundennummer die ich als einzelnen Wert benötige). Ich hoffe das es so richtig ist.

Nun habe ich eine generelles Problem. Bei der IpadAPP handelt es sich um einen Lieferschein für Leistungen und Material. Nun passiert es, wenn nur Material geliefert wird, das das Script nicht durchläuft da einzelne Objekte der Leistungserfassung gar nicht vorhanden sind.

So sieht die gelieferte XML Datei ohne erfasste Arbeitszeit aus.

01.
  
02.
<?xml version="1.0" encoding="UTF-8"?> 
03.
<stundenbericht> 
04.
  <rechnungsadresse>10101 
05.
Testvorname Testnachnme 
06.
Teststrasse 11 
07.
12345 Testort 
08.
Deutschland</rechnungsadresse> 
09.
  <ausfuehrungsort/> 
10.
  <berichtNr>14</berichtNr> 
11.
  <arbeiten/> 
12.
  <material/> 
13.
  <materialeintrag> 
14.
    <bezeichnung>Testartikel</bezeichnung> 
15.
    <artikelnr>12345</artikelnr> 
16.
    <menge>1</menge> 
17.
    <verpackungseinheit/> 
18.
    <einzelpreis/> 
19.
    <gesamtpreis>0,00</gesamtpreis> 
20.
  </materialeintrag> 
21.
  <materialeintrag> 
22.
    <bezeichnung>Testartikel2</bezeichnung> 
23.
    <artikelnr>12346</artikelnr> 
24.
    <menge>1</menge> 
25.
    <verpackungseinheit/> 
26.
    <einzelpreis/> 
27.
    <gesamtpreis>0,00</gesamtpreis> 
28.
  </materialeintrag> 
29.
  <materialeintrag> 
30.
    <bezeichnung>Testartikel3</bezeichnung> 
31.
    <artikelnr>12347</artikelnr> 
32.
    <menge>1</menge> 
33.
    <verpackungseinheit/> 
34.
    <einzelpreis/> 
35.
    <gesamtpreis>0,00</gesamtpreis> 
36.
  </materialeintrag> 
37.
  <gesamtpreisNetto>0,00</gesamtpreisNetto> 
38.
  <steuer>0,00</steuer> 
39.
  <gesamtpreisBrutto>0,00</gesamtpreisBrutto> 
40.
  <datum>05.08.11</datum> 
41.
  <auswahllisteBezeichnung1>Pos</auswahllisteBezeichnung1> 
42.
  <auswahleintrag1/> 
43.
  <unterzeichner/> 
44.
</stundenbericht>
Es fehlt hier der komplette Bereich Tätigkeit.

Kann man erreichen das das Script immer durchläuft damit in dem Fall immer noch das Objekt "Rechnungsadresse" bearbeitet wird ?
Bitte warten ..
Mitglied: rubberman
08.08.2011 um 14:50 Uhr
Hallo twin850,

klar kann man. Welches der Scripte verwendest du?

Grüße
rubberman
Bitte warten ..
Mitglied: twin850
08.08.2011 um 16:13 Uhr
Hallo rubberman,

folgendes Script verwende ich

01.
If WScript.Arguments.Count < 1 Then 
02.
  WScript.Echo "Syntax:" & _ 
03.
    vbLf & "cscript //nologo """ & WScript.ScriptName & """ ""Pfad"" [""FixerWert""]" & _ 
04.
    vbLf & vbLF & "Returncodes:" & _ 
05.
    vbLf & "3  zu wenig Argumente" & _ 
06.
    vbLf & "2  Verzeichnis nicht gefunden" & _ 
07.
    vbLf & "1  eine oder Mehrere Dateien konnten nicht verarbeitet werden" & _ 
08.
    vbLf & "0  alle gefundenen Dateien erfolgreich verarbeitet" & vbLf     
09.
  WScript.Quit 3 
10.
End If 
11.
 
12.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
13.
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
14.
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 2 
15.
 
16.
If WScript.Arguments.Count > 1 Then 
17.
  strFixedValue = WScript.Arguments(1) 
18.
Else 
19.
  strFixedValue = "1050" 
20.
End If 
21.
 
22.
iSucc = 0 
23.
iErr = 0 
24.
For Each objFile In objFSO.GetFolder(strSrcDir).Files 
25.
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then 
26.
    If Process_XML(objFile.Path) Then 
27.
      WScript.Echo """" & objFile.Name & """ - Verarbeitung erfolgreich." 
28.
      iSucc = iSucc + 1 
29.
    Else 
30.
      WScript.Echo """" & objFile.Name & """ - Verarbeitung fehlgeschlagen." 
31.
      iErr = iErr + 1 
32.
    End If 
33.
  End If 
34.
Next 
35.
WScript.Echo vbLf & iSucc + iErr & " Dateien verarbeitet." & _ 
36.
  vbLf & iSucc & " erfolreich" & _ 
37.
  vbLf & iErr & " fehlgeschlagen" & vbLf 
38.
If iErr > 0 Then WScript.Quit 1 
39.
 
40.
 
41.
Function Process_XML(ByRef strXmlDoc) 
42.
    Set objXmlDoc = CreateObject("Microsoft.XMLDOM") 
43.
    objXmlDoc.async = False 
44.
    objXmlDoc.load(strXmlDoc) 
45.
 
46.
    Set objNode1 = objXmlDoc.documentElement.SelectSingleNode("//arbeiten") 
47.
    If objNode1 Is Nothing Then 
48.
      Process_XML = False 
49.
      Exit Function 
50.
    End If 
51.
 
52.
    Set objNode2 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitBeginn") 
53.
    If objNode2 Is Nothing Then 
54.
      Process_XML = False 
55.
      Exit Function 
56.
    End If 
57.
 
58.
    objNode2.text = objNode1.text 
59.
 
60.
    Set objNode3 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeit") 
61.
    If objNode3 Is Nothing Then 
62.
      Process_XML = False 
63.
      Exit Function 
64.
    End If 
65.
 
66.
    strArbeitszeit = objNode3.text 
67.
    objNode3.text = Left(strArbeitszeit, Len(strArbeitszeit) - 1) 
68.
 
69.
    Set objNode4 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitEnde") 
70.
    If objNode4 Is Nothing Then 
71.
      Process_XML = False 
72.
      Exit Function 
73.
    End If 
74.
 
75.
    objNode4.text = strFixedValue 
76.
 
77.
    Set objNode5 = objXmlDoc.documentElement.SelectSingleNode("//rechnungsadresse") 
78.
    If objNode5 Is Nothing Then 
79.
      Process_XML = False 
80.
      Exit Function 
81.
    End If 
82.
 
83.
    strrechnungsadresse = objNode5.text 
84.
    objNode5.text = Left(strrechnungsadresse,5) 
85.
 
86.
    objXmlDoc.save(strXmlDoc) 
87.
    Set objXmlDoc = Nothing 
88.
 
89.
    Process_XML = True 
90.
End Function
Bitte warten ..
Mitglied: rubberman
08.08.2011 um 19:46 Uhr
Hallo twin850,

habe leider erst nach Feierabend die Zeit gefunden ...
Mit ein paar kleinen Anpassungen sieht das Script nun so aus:
01.
If WScript.Arguments.Count < 1 Then 
02.
  WScript.Echo "Syntax:" & _ 
03.
    vbLf & "cscript //nologo """ & WScript.ScriptName & """ ""Pfad"" [""FixerWert""]" & _ 
04.
    vbLf & vbLF & "Returncodes:" & _ 
05.
    vbLf & "3  zu wenig Argumente" & _ 
06.
    vbLf & "2  Verzeichnis nicht gefunden" & _ 
07.
    vbLf & "1  eine oder Mehrere Dateien konnten nicht verarbeitet werden" & _ 
08.
    vbLf & "0  alle gefundenen Dateien erfolgreich verarbeitet" & vbLf     
09.
  WScript.Quit 3 
10.
End If 
11.
 
12.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
13.
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
14.
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 2 
15.
 
16.
If WScript.Arguments.Count > 1 Then 
17.
  strFixedValue = WScript.Arguments(1) 
18.
Else 
19.
  strFixedValue = "1050" 
20.
End If 
21.
 
22.
iSucc = 0 
23.
iErr = 0 
24.
For Each objFile In objFSO.GetFolder(strSrcDir).Files 
25.
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then 
26.
    iRet = Process_XML(objFile.Path) 
27.
    If iRet > 0 Then 
28.
      WScript.Echo """" & objFile.Name & """ - " & iRet & " Knoten verarbeitet." 
29.
      iSucc = iSucc + 1 
30.
    Else 
31.
      WScript.Echo """" & objFile.Name & """ - Verarbeitung fehlgeschlagen." 
32.
      iErr = iErr + 1 
33.
    End If 
34.
  End If 
35.
Next 
36.
WScript.Echo vbLf & iSucc + iErr & " Dateien verarbeitet." & _ 
37.
  vbLf & iSucc & " erfolreich" & _ 
38.
  vbLf & iErr & " fehlgeschlagen" & vbLf 
39.
If iErr > 0 Then WScript.Quit 1 
40.
 
41.
 
42.
Function Process_XML(ByRef strXmlDoc) 
43.
    Set objXmlDoc = CreateObject("Microsoft.XMLDOM") 
44.
    objXmlDoc.async = False  
45.
    objXmlDoc.load(strXmlDoc) 
46.
    iCounter = 0 
47.
 
48.
    Set objNode1 = objXmlDoc.documentElement.SelectSingleNode("//arbeiten") 
49.
    If Not objNode1 Is Nothing Then 
50.
      Set objNode2 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitBeginn") 
51.
      If Not objNode2 Is Nothing Then 
52.
        objNode2.text = objNode1.text 
53.
        iCounter = iCounter + 2 
54.
      End If 
55.
    End If 
56.
 
57.
    Set objNode3 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeit") 
58.
    If Not objNode3 Is Nothing Then 
59.
      strArbeitszeit = objNode3.text 
60.
      objNode3.text = Left(strArbeitszeit, Len(strArbeitszeit) - 1) 
61.
      iCounter = iCounter + 1 
62.
    End If 
63.
 
64.
    Set objNode4 = objXmlDoc.documentElement.SelectSingleNode("//taetigkeit/arbeitszeitEnde") 
65.
    If Not objNode4 Is Nothing Then 
66.
      objNode4.text = strFixedValue 
67.
      iCounter = iCounter + 1 
68.
    End If 
69.
 
70.
    Set objNode5 = objXmlDoc.documentElement.SelectSingleNode("//rechnungsadresse") 
71.
    If Not objNode5 Is Nothing Then 
72.
      strrechnungsadresse = objNode5.text 
73.
      objNode5.text = Left(strrechnungsadresse, 5) 
74.
      iCounter = iCounter + 1 
75.
    End If 
76.
 
77.
    If iCounter > 0 Then objXmlDoc.save(strXmlDoc) 
78.
    Set objXmlDoc = Nothing 
79.
 
80.
    Process_XML = iCounter 
81.
End Function
Hoffe das funktioniert wie gewünscht.

Grüße
rubberman
Bitte warten ..
Mitglied: twin850
08.08.2011 um 21:39 Uhr
Hallo Rubberman und Grüße nach GTH komme aus MHL, klein ist die Welt

Funktioniert einwandfrei. Ich hab zwar noch ein generelles Problem, damit kann ich mich aber arrangieren.

Ich warte noch ein paar Tage dann setz ich auf gelöst.

VIELEN DANK
Bitte warten ..
Mitglied: rubberman
08.08.2011 um 21:47 Uhr
Haha noch'n Thüringer

Generelles Problem, dass hier lösbar wäre?

In dem Zusammenhang:
Die XML Dateien werden ja mehr oder weniger sinnentfremdet. Gibt es nicht die Möglichkeit die einmal angefassten Werte gleich in eine einzelne Datei zu bringen, die euer WaWi System versteht?

Grüße nach MHL
rubberman
Bitte warten ..
Mitglied: twin850
08.08.2011 um 23:56 Uhr
Hallo rubberman,

sorry, ging nicht früher.

Die generellen Probleme liegen eher in der APP. So wird z.B. die Zeiterfassung über eine Art Stoppuhr gergelt. (Kommen und Gehen). Allerdings wird hier nicht gerundet, so dass zb. 55 Minuten als 0,42h in der XML Datei ausgegeben werden. Das sieht auf nem Auftrag natürlich blöd aus. Wenn man es noch hinbekommen würde das der Wert <arbeitszeit> auf 0,25 0,5 0,75 bzw. 1 auf -bzw. abzurunden wäre toll. Ich kann mich aber auch damit arrangieren, das ich beim erfassen per "Hand" runde.

Was die Sinnentfremdung angeht stimme ich Dir zu. Allerdings ist dem WAWI völlig egal wie die gelieferte XML Datei aussieht da ich per Definitionsdatei bestimme wo sich welche Werte befinden. Ohne diese Definitionsdatei geht garnichts, selbst wenn die orignial <Tag's> mit den Datenbankfeldnamen im WAWI übereinstimmen.

Wichtig ist nur, das sich alle Werte für die gelieferten Artikel jeweils unter dem <TAG> <materialeintrag> befinden und die ausgeführten Leistungen unter dem <TAG> <Tätigkeiten>. Und hier war halt das Prolbem das der Text für die Arbeiten als eingenständiges Objekt in der XML Datei auftaucht und somit nicht der entsprechenden Auftragsposition zuzuordnen war.

Bsp. gelieferte XML Datei

01.
 
02.
<stundenbericht> 
03.
  <rechnungsadresse>10101 
04.
Testvorname Testnachnme 
05.
Teststrasse 11 
06.
12345 Testort 
07.
Deutschland</rechnungsadresse> 
08.
  <ausfuehrungsort/> 
09.
  <berichtNr>31</berichtNr> 
10.
  <arbeiten>Testleistung 1 
11.
Testleisting 2 
12.
Bestleistung 3</arbeiten> 
13.
  <material/> 
14.
  <materialeintrag> 
15.
    <bezeichnung>AOC 2216Sa TFT 22Zoll wide analog</bezeichnung> 
16.
    <artikelnr>1573</artikelnr> 
17.
    <menge>1</menge> 
18.
    <verpackungseinheit>0,00</verpackungseinheit> 
19.
    <einzelpreis/> 
20.
    <gesamtpreis>0,00</gesamtpreis> 
21.
  </materialeintrag> 
22.
  <materialeintrag> 
23.
    <bezeichnung>VMware vSphere 4 Essentials Bundle for 3 hosts</bezeichnung> 
24.
    <artikelnr>1748</artikelnr> 
25.
    <menge>1</menge> 
26.
    <verpackungseinheit>0,00</verpackungseinheit> 
27.
    <einzelpreis/> 
28.
    <gesamtpreis>0,00</gesamtpreis> 
29.
  </materialeintrag> 
30.
  <gesamtpreisNetto>0,00</gesamtpreisNetto> 
31.
  <steuer>0,00</steuer> 
32.
  <gesamtpreisBrutto>0,00</gesamtpreisBrutto> 
33.
  <datum>08.08.11</datum> 
34.
  <taetigkeit> 
35.
    <datum>08.08.11</datum> 
36.
    <fahrzeit/> 
37.
    <fahrzeitAbfahrt/> 
38.
    <fahrzeitAnkunft/> 
39.
    <fahrstrecke/> 
40.
    <arbeitszeit>1h</arbeitszeit> 
41.
    <arbeitszeitBeginn>22:30</arbeitszeitBeginn> 
42.
    <arbeitszeitEnde>23:30</arbeitszeitEnde> 
43.
    <pausenzeit/> 
44.
    <pausenzeitBeginn/> 
45.
    <pausenzeitEnde/> 
46.
    <pausenzeit2/> 
47.
    <pausenzeit2Beginn/> 
48.
    <pausenzeit2Ende/> 
49.
    <name/> 
50.
  </taetigkeit> 
51.
  <auswahllisteBezeichnung1>Pos</auswahllisteBezeichnung1> 
52.
  <auswahleintrag1/> 
53.
  <unterzeichner/> 
54.
</stundenbericht>
Die entsprechende Definitionsdatei des WAWI

01.
 
02.
<stundenbericht NewData="AUFTRAG"> 
03.
  <rechnungsadresse>#KUNADRESSE.NR</rechnungsadresse> 
04.
  <berichtNr>#AUFTRAGNR</berichtNr> 
05.
  <materialeintrag NewData="ATRPOS"> 
06.
    <bezeichnung>#BEZEICHUNG</bezeichnung> 
07.
    <artikelnr>#ARTIKELNR</artikelnr> 
08.
    <menge>#MENGE</menge> 
09.
  </materialeintrag> 
10.
  <datum>#AUFTRAG.DATUM</datum> 
11.
  <taetigkeit NewData="ATRPOS"> 
12.
    <arbeitszeit>#MENGE</arbeitszeit> 
13.
    <arbeitszeitBeginn>#text</arbeitszeitBeginn> 
14.
    <arbeitszeitEnde>#Artikel.Nr</arbeitszeitEnde> 
15.
  </taetigkeit> 
16.
</stundenbericht>
Während das WAWI die gelieferte XML Datei abarbeitet wird nun für jeden <TAG> materialeintrag und Tätigkeit eine neue Auftragspostion angelegt. Dafür auch der feste Wert 1050, das ist die Artikelnummer für Leistungen im WAWI.

Ein erneutes schreiben der XML Datei wäre meiner Meinung nach daher nur für eine bessere Optik.

Bitte entschuldige meine nicht immer korrekte Verwendung von Begriffen wie <Tag>, Objekt etc. Ich hoffe Du verstehst micht trotzdem.

Gruß

twin850
Bitte warten ..
Mitglied: rubberman
09.08.2011 um 01:05 Uhr
Hallo twin850.

Verstehe wie es funktioniert. Ich hatte an so etwas triviales wie eine CSV Datei gedacht. Die meisten Datenbanksysteme sind in der Lage solche sonderzeichengetrennten Werte zu importieren.

Was das Rundungsproblem angeht, teste mal mit
      objNode3.text = CStr(Round(Left(strArbeitszeit, Len(strArbeitszeit) - 1) * 4, 0) / 4)
Je nach Locale-Einstellung musst du einmalig nachsehen, ob du tatsächlich einen Dezimalwert bekommst und ob das Dezimaltrennzeichen als Komma kommt. Bei mir funktioniert das so.

Grüße
rubberman
Bitte warten ..
Mitglied: twin850
09.08.2011 um 16:32 Uhr
Hallo Rubberman,

auch das funktioniert auf Anhieb. RESPEKT.

Monentan rufe ich das Script über eine Batch Datei auf.

01.
cscript /nologo "replace.vbs" "PfadDerXMLDateien"
Mache ich das von der Befehlszeile aus bekomme ich auch Rückmeldung ob erfolgreich oder nicht. Rufe ich die Batch als Verknüpfung bekomme ich keine Rückmeldung, da ja das Fenster gleich wieder zugeht. Wie bekomme ich die Statusmeldung als Windows Fenster ?

Danke und dann wars das wirklich.

Gruß

twin850
Bitte warten ..
Mitglied: rubberman
09.08.2011 um 18:51 Uhr
Hallo twin850,

Der PAUSE Befehl verhindert das Schließen des Fensters.
01.
@echo off 
02.
cscript //nologo "replace.vbs" "PfadDerXMLDateien" 
03.
pause
Falls der Batch nicht im gleichen Verzeichnis mit dem VBScript liegt, musst du natürlich den gesamten Pfad zu replace.vbs angeben.

Andere Möglichkeit:
du legst eine Verknüpfung an, mit ...
Ziel:
%SystemRoot%\System32\cmd.exe /k cscript.exe //nologo "C:\Pfad\zu\Replace.vbs" "C:\Pfad\zu\XMLDateien"
Ausführen in:
%SystemRoot%\System32

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
09.08.2011 um 18:55 Uhr
Hallo twin850,

hier noch ein Verbesserungsvorschlag von mir. Ich modifiziere dazu mal das letzte Script von Rubberman, poste hier allerdings nur den ersten Teil, ohne das Unterprogramm ProcessXML, da sich dort nichts geändert hat.
01.
If WScript.Arguments.Count < 1 Then 
02.
  WScript.Echo "Syntax:" & _ 
03.
    vbLf & """" & WScript.ScriptName & """ ""Pfad"" [""FixerWert""]" & _ 
04.
    vbLf & vbLF & "Returncodes:" & _ 
05.
    vbLf & "3  zu wenig Argumente" & _ 
06.
    vbLf & "2  Verzeichnis nicht gefunden" & _ 
07.
    vbLf & "1  eine oder Mehrere Dateien konnten nicht verarbeitet werden" & _ 
08.
    vbLf & "0  alle gefundenen Dateien erfolgreich verarbeitet" & vbLf 
09.
  WScript.Quit 3 
10.
End If 
11.
 
12.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
13.
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
14.
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 2 
15.
 
16.
If WScript.Arguments.Count > 1 Then 
17.
  strFixedValue = WScript.Arguments(1) 
18.
Else 
19.
  strFixedValue = "1050" 
20.
End If 
21.
 
22.
strLogPath = objFSO.GetParentFolderName(WScript.ScriptFullName) 
23.
strLogName = objFSO.GetBaseName(WScript.ScriptName) & " " & _ 
24.
             Year(Now) & "-" & Right("0" & Month(Now), 2) & "-" & Right("0" & Day(Now), 2) & " " & _ 
25.
             Right("0" & Hour(Now), 2) & "-" & Right("0" & Minute(Now), 2) & "-" & Right("0" & Second(Now), 2) & _ 
26.
             ".log" 
27.
 
28.
Set objLogFile = objFSO.CreateTextFile(objFSO.BuildPath(strLogPath, strLogName), True) 
29.
 
30.
iSucc = 0 
31.
iErr = 0 
32.
 
33.
For Each objFile In objFSO.GetFolder(strSrcDir).Files 
34.
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then 
35.
    iRet = Process_XML(objFile.Path) 
36.
    If iRet > 0 Then 
37.
      objLogFile.WriteLine """" & objFile.Name & """ - " & iRet & " Knoten verarbeitet." 
38.
      iSucc = iSucc + 1 
39.
    Else 
40.
      objLogFile.WriteLine """" & objFile.Name & """ - Verarbeitung fehlgeschlagen." 
41.
      iErr = iErr + 1 
42.
    End If 
43.
  End If 
44.
Next 
45.
 
46.
objLogFile.Close 
47.
 
48.
strMessage = iSucc + iErr & " Dateien verarbeitet." & _ 
49.
  vbLf & iSucc & " erfolreich" & _ 
50.
  vbLf & iErr & " fehlgeschlagen" & _ 
51.
  vbLf & _ 
52.
  vbLf & "Möchten Sie sich die Log-Datei anschauen?" 
53.
 
54.
If iErr = 0 Then 
55.
  cButtons = vbQuestion 
56.
Else 
57.
  cButtons = vbCritical 
58.
End If 
59.
 
60.
If MsgBox(strMessage, cButtons + vbYesNo, WScript.ScriptName) = vbYes Then 
61.
  Set objShell = CreateObject("WScript.Shell") 
62.
  objShell.Run "notepad.exe """ & objFSO.BuildPath(strLogPath, strLogName) & """" 
63.
End If 
64.
 
65.
If iErr > 0 Then WScript.Quit 1
Die Meldungen des Scripts werden in eine Log-Datei geschrieben, die im gleichen Verzeichnis wie das Script angelegt wird. Wenn das Script z.B. "PatchXML.vbs" heißt, wird die Log-Datei unter dem Namen "PatchXML YYYY-MM-DD HH-MM-SS.log" angelegt (der Name enthält also einen Zeitstempel). Wenn das Script seine Arbeit getan hat, erscheint eine Dialogbox, die über das Ergebnis informiert und fragt, ob man sich die Log-Datei anschauen möchte. Nach Klick auf den Button "Ja" wird dann Notepad gestartet und zeigt die Datei an.

Vorteil der Ausgabe der Meldungen in eine Log-Datei: Du kannst jetzt wieder den Ordner mit den XML-Dateien per Drag&Drop auf das Icon des Scripts ziehen, ohne bei jeder bearbeiteten Datei eine Dialogbox mit der Meldung "X Knoten verarbeitet" bzw. "Verarbeitung fehlgeschlagen" weg klicken zu müssen.

Gruß
Friemler
Bitte warten ..
Mitglied: rubberman
09.08.2011 um 19:08 Uhr
Hallo Friemler,

sieht gut aus
Dann haben wir es wieder mal geschafft einen Mammut-Thread zu schreiben Aber so lange es konstruktiv ist, wird hoffentlich keiner was dagegen haben.

Grüße
rubberman
Bitte warten ..
Mitglied: twin850
09.08.2011 um 20:22 Uhr
Hallo rubberman, Hallo friemler,

< dann haben wir es wieder mal geschafft einen Mammut-Thread zu schreiben...

Und ich habe schon ein schlechtes Gewissen.

Setze jetzt auf gelöst und hoffe ich kann mich irgendwann ma, revanchieren.

Gruß

Twin850
Bitte warten ..
Mitglied: riatnep
02.10.2013, aktualisiert um 14:14 Uhr
Hallo zusammen,

ich schließe mich mal diesem Thread an da ich eine ähnliche Frage habe und einfach nicht weiter komme.
Wie kann ich in einer XML einige Zeilen zusätzlich per Script hinzufügen?

Soll:
01.
<?xml version="1.0" encoding="utf-8" ?> 
02.
<Document> 
03.
<CstmrCdtTrfInitn> 
04.
<GrpHdr> 
05.
<MsgId>20130619001</MsgId>  
06.
<CreDtTm>2013-06-19T14:22:08</CreDtTm>  
07.
<NbOfTxs>1</NbOfTxs>  
08.
<CtrlSum>100.00</CtrlSum>  
09.
<InitgPty> 
10.
<Nm>Company Name</Nm>  
11.
<Id> 
12.
<OrgId> 
13.
<Othr> 
14.
<Id>123456789</Id>  
15.
</Othr> 
16.
</OrgId> 
17.
</Id> 
18.
</InitgPty> 
19.
</GrpHdr> 
20.
</CstmrCdtTrfInitn> 
21.
</Document> 
22.
 
Ist:
01.
<?xml version="1.0" encoding="utf-8" ?> 
02.
<Document> 
03.
<CstmrCdtTrfInitn> 
04.
<GrpHdr> 
05.
<MsgId>20130619001</MsgId>  
06.
<CreDtTm>2013-06-19T14:22:08</CreDtTm>  
07.
<NbOfTxs>1</NbOfTxs>  
08.
<CtrlSum>100.00</CtrlSum>  
09.
<InitgPty> 
10.
<Nm>Company Name</Nm>  
11.
</InitgPty> 
12.
</GrpHdr> 
13.
</CstmrCdtTrfInitn> 
14.
</Document>
Sprich die Zeilen von 11 bis 17 sollen immer nach <Nm Company Name </Nm> hinzugefügt werden. Diese hinzugefügten Zeilen sind fix und müssen nicht angepasst werden.
Die Datei mit dem neuen Inhalt soll als neue Datei im gleichen Verzeichnis mit anderem Namen abgelegt werden.

Wäre super wenn Ihr Eure Ideen mit einbirngen könntet.

Viele Grüße
Steffen
Bitte warten ..
Mitglied: rubberman
02.10.2013 um 22:24 Uhr
Hallo riatnep, willkommen im Forum.

Magst du vielleicht trotzdem einen neuen Thread erstellen? Dieser ist 2 Jahre alt und deine Frage wird wohl von den allermeisten Helfern nicht mehr wahrgenommen. (Abgesehen davon, dass du fremde Threads nicht für deine Themen nutzen solltest. Das ist eine Frage der "Netiquette".) Natürlich kannst du dann auf diesen Thread verweisen.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
XML
gelöst XML Datei per Skript ändern (12)

Frage von chrisen zum Thema XML ...

Batch & Shell
Script zum XML Datei Umschreiben (12)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
gelöst XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern (4)

Frage von ELEVATOR zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...