none
Suchen in HTML-Tabelle und ersetzen (erweitern) einzelner Zeilen durch Inhalte aus XML-Datei RRS feed

  • Frage

  •  

    Hallo zusammen,

    ich möchte eine tabellarische HTML-Datei, welche Windows-Eventlogs enthält, bei bestimmten Protokolleinträgen erweitern. Dazu habe ich eine Sammlung von wichtigen Events in einer XML-Datei erfasst.

    Der Inhalt der XML-Datei ist nach folgendem Muster aufgebaut:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <windows_logs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <event>
            <Source>Beispiel</Source>
            <EventID>4711</EventID>
            <Kommentar>Dies ist nur ein Beispiel</Kommentar>
        </event>
        <event>
            <Source>QuelleXYZ</Source>
            <EventID>5</EventID>
            <Kommentar>Umgehend Serviceprozedur XYZ einleiten.</Kommentar>
        </event>
        <event>
            <Source>Test</Source>
            <EventID>1508</EventID>
            <Kommentar>Server Neustart erforderlich.</Kommentar>
        </event>
    </windows_logs>
    


    Die HTML-Datei hat u.a. folgende Inhalte:
    (...)
    <table>
    (...)
    <tr><th>TimeWritten</th><th>EntryType</th><th>EventID</th><th>Source</th><th>Message</th><th>Kommentar</th></tr>
    <tr><td>04.10.2011 18:16:34</td><td>Warning</td><td>4711</td><td>Beispiel</td><td>Fehler in Benutzerprofil.</td><td></td></tr>
    <tr><td>05.10.2011 04:33:52</td><td>Error</td><td>1090</td><td>Userenv</td><td>Dieser Eintrag wurde durch Windows Management Instrumentation erzeugt.</td><td></td></tr>
    <tr><td>05.10.2011 06:55:21</td><td>Error</td><td>1508</td><td>Test</td><td>Es ist ein kritischer Fehler aufgetreten.</td><td></td></tr>
    <tr><td>05.10.2011 09:01:07</td><td>Warning</td><td>3</td><td>Print</td><td>Der Druckertreiber XYZ konnte nicht gelöscht werden.</td><td></td></tr>
    <tr><td>05.10.2011 09:14:12</td><td>Error</td><td>5</td><td>QuelleXYZ</td><td>Dienst ABC wurde unerwartet beendet.</td><td></td></tr></table>
    

     

    Das Skript das ich benötige soll nun die XML-Datei für jeden <event> durchlaufen und in jeder Zeile der HTML-Datei prüfen, ob die entsprechende Kombination von <Source> und <EventID> dort vorkommt. Sollte diese Kombination gefunden werden, dann soll <Kommentar> an die passende Stelle der HTML-Datei eingefügt werden. Die HTML-Datei soll dann letztendlich so aussehen:

    (...)
    <table>
    (...)
    <tr><th>TimeWritten</th><th>EntryType</th><th>EventID</th><th>Source</th><th>Message</th><th>Kommentar</th></tr>
    <tr><td>04.10.2011 18:16:34</td><td>Warning</td><td>4711</td><td>Beispiel</td><td>Fehler in Benutzerprofil.</td><td>Dies ist nur ein Beispiel</td></tr>
    <tr><td>05.10.2011 04:33:52</td><td>Error</td><td>4711</td><td>Userenv</td><td>Dieser Eintrag wurde durch Windows Management Instrumentation erzeugt.</td><td></td></tr>
    <tr><td>05.10.2011 06:55:21</td><td>Error</td><td>1508</td><td>Test</td><td>Es ist ein kritischer Fehler aufgetreten.</td><td>Server Neustart erforderlich.</td></tr>
    <tr><td>05.10.2011 09:01:07</td><td>Warning</td><td>3</td><td>Print</td><td>Der Druckertreiber XYZ konnte nicht gelöscht werden.</td><td></td></tr>
    <tr><td>05.10.2011 09:14:12</td><td>Error</td><td>5</td><td>QuelleXYZ</td><td>Dienst ABC wurde unerwartet beendet.</td><td>Umgehend Serviceprozedur XYZ einleiten.</td></tr></table>
    

     

    Meine Schwierigkeit ist nun einen passenden Weg zu finden, die HTML-Datei zu durchsuchen, gewünschte Erweiterungen einzufügen und dabei Variablen Inhalt (TimeWritten, EntryType und HTML-Tags) nicht zu verändern. So sieht mein nicht funktionierender Ansatz bisher aus:

    $BEKANNTE_EVENTS = [XML] (Get-Content "C:\win_events.xml")
    $HTML = get-content "C:\test.html"
    
    $I = 0
    While ($BEKANNTE_EVENTS.windows_logs.event.count -gt $I) {
        $SOURCE = $BEKANNTE_EVENTS.windows_logs.event[$I] | %{$_.Source}
        $EVENTID = $BEKANNTE_EVENTS.windows_logs.event[$I] | %{$_.EventID}
        $KOMMENTAR = $BEKANNTE_EVENTS.windows_logs.event[$I] | %{$_.Kommentar}
       
        $RESULTS = $HTML | Foreach-Object {
            $_ -replace("<tr>.*<td>$EVENTID<`/td><td>$SOURCE<`/td>.*<`/tr>","<tr>.*td>$EVENTID<`/td><td>$SOURCE<`/td><td>*<`/td><td>$KOMMENTAR<`/td><`/tr>")
        }
       
        $I = $I+1
    }
    
    $RESULTS | Out-String > C:\test_mit_kommentar.html
    

    Wie muss mein String zum Suchen und Ersetzen richtig lauten um die HTML-Datei entsprechend erweitern zu können? Ist dieses Vorhaben überhaupt so umsetzbar?

    Vielen Dank für Hinweise aller Art!

    Schöne Grüße,
    Andreas
    Mittwoch, 5. Oktober 2011 08:19

Antworten

  • Wenn deine HTML-Datei immer gleich aufgebaut und mit line-breaks nach jeder Tabellenzeile ausgestattet ist, geht auch diese einfache Variante:


    $root = "D:\tmp\test"
    $EVENTS = [XML] (Get-Content "$root\win_events.xml")
    $HTML = get-content "$root\test.html"
    $newHTML =  "$root\test-out.html"
    
    foreach ($line in $HTML) { 
     foreach ($event in $EVENTS.windows_logs.event) {
       if (($line -match $event.Source) -and ($line -match $event.Source)) {
    	 $tobereplaced = "</td><td></td>"
    	 $replacement =  "</td><td>"+$event.Kommentar +"</td>"
             $line = $line -replace $tobereplaced,$replacement
       }
      }
      Add-Content $newHTML $line
    }
    

     

    Ansonnsten müsste man die Html-Datei als einen großen String behandeln (ohne foreach..) und die kompletten Tabellenzeilen ersetzen. Aber versuchs erstmal so.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    • Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Oktober 2011 07:43
    • Als Antwort markiert _A-G_ Dienstag, 11. Oktober 2011 06:51
    Samstag, 8. Oktober 2011 11:33
    Moderator

Alle Antworten

  • Wenn deine HTML-Datei immer gleich aufgebaut und mit line-breaks nach jeder Tabellenzeile ausgestattet ist, geht auch diese einfache Variante:


    $root = "D:\tmp\test"
    $EVENTS = [XML] (Get-Content "$root\win_events.xml")
    $HTML = get-content "$root\test.html"
    $newHTML =  "$root\test-out.html"
    
    foreach ($line in $HTML) { 
     foreach ($event in $EVENTS.windows_logs.event) {
       if (($line -match $event.Source) -and ($line -match $event.Source)) {
    	 $tobereplaced = "</td><td></td>"
    	 $replacement =  "</td><td>"+$event.Kommentar +"</td>"
             $line = $line -replace $tobereplaced,$replacement
       }
      }
      Add-Content $newHTML $line
    }
    

     

    Ansonnsten müsste man die Html-Datei als einen großen String behandeln (ohne foreach..) und die kompletten Tabellenzeilen ersetzen. Aber versuchs erstmal so.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    • Als Antwort vorgeschlagen Alex Pitulice Montag, 10. Oktober 2011 07:43
    • Als Antwort markiert _A-G_ Dienstag, 11. Oktober 2011 06:51
    Samstag, 8. Oktober 2011 11:33
    Moderator
  • Hallo Andreas,

     

    Hat die Antwort von Denniver deine Situation abgeklärt? Können wir den Thread schließen?

     

    Viele Grüße,

    Alex

    Dienstag, 11. Oktober 2011 06:37
  • Hat wunderbar funktioniert. Besten Dank dafür!
    Dienstag, 11. Oktober 2011 06:51
  • Ja, Thread kann geschlossen werden.
    Dienstag, 11. Oktober 2011 06:52