You are not logged in.

  • Login

1

Sunday, May 2nd 2010, 6:49pm

getElementsByTagName eines bestimmten Parent-Node

Hallo Forum

Ich versuche grade via VBScript ein Logfile unserer Backup-Software (Symantec BackupExec) automatisch auszulesen. In XML habe ich leider keine Erfahrung und alles was ich im Internet gefunden habe hat mich auch nicht weiter gebracht. Ich habe das Backup-Log mal aufs wesentliche gekürzt:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  <?xml version="1.0" encoding="UTF-16" ?> 
  <backup>
   <machine>
    <machine_name>Servername</machine_name> 
     <set>
      <set_resource_name>C: SYSTEM</set_resource_name> 
     </set>
   </machine>
  </backup>
  
  ...
  
  <verify>
   <set>
    <set_resource_name>C: SYSTEM</set_resource_name>
   </set>
  </verify>


Unter anderem will ich natürlich auslesen was gesichert wurde. Dies wird im Node "set_resource_name" gespeichert. Leider ist das Backup-Log in zwei Teile aufgeteilt, der eigentlichen Sicherung (Backup) und einer Überprüfung (Verify). Dummerweise wird der gleiche Nodename verwendet. Mein Problem also ist, dass wenn ich via...

Source code

1
getElementsByTagName("set_resource_name")


...das Log durchsuche, es sowohl die Elemente des Backups- wie die vom Verify-Teils auflistet.

Kann mir bitte jemand den Code geben, wie ich via VBS nur diejenigen "set_resource_name"-Nodes auslesen kann, die sich innerhalb des <backup></backup>-Teils befinden?

Gruss
Devoid

This post has been edited 2 times, last edit by "Devoid" (May 2nd 2010, 8:30pm)


2

Monday, May 3rd 2010, 3:07pm

Bin durch google auch auch die Seite

Methoden zu XML

dort ist auch getElementsByTagName beschrieben
aber es geht nicht
durch weiters suchen fand ich
selectSingleNode

zum testen xml valid gemacht

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-16"?>
<root>
	<backup>
		<machine>
			<machine_name>Servername</machine_name>
			<set>
				<set_resource_name>C: SYSTEM im Backup</set_resource_name>
			</set>
		</machine>
	</backup>
	<verify>
		<set>
			<set_resource_name>C: SYSTEM im Verify</set_resource_name>
		</set>
	</verify>
</root>


in einer Html datei vbs code getestet
selectSingleNode arbeitet ähnlich wie xpath.
Daruch kann der Knoten der gesucht wird bestimmt werden

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<body>

<script type="text/vbscript">
Dim xmlDoc, Root

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.async = False
xmlDoc.load("c:\xml\testvbs.xml")
document.write("<h1>" + xmlDoc.selectSingleNode("//backup/machine/set/set_resource_name").text  + "</h1>")
document.write("<h1>" + xmlDoc.selectSingleNode("//verify/set/set_resource_name").text  + "</h1>")

</script>

</body>
</html>


Ergebniss

Source code

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Transitional//EN"><META http-equiv="Content-Type" content="text/html; charset=windows-1252"> 
<HTML>
<HEAD></HEAD> 
<BODY>
<H1>
C: SYSTEM im Backup
</H1>
<H1>
C: SYSTEM im Verify
</H1>
</BODY> 
</HTML>

3

Monday, May 3rd 2010, 5:59pm

Hi XML_Looser

Danke für deine Antwort. Auf das SelectSingleNode war ich auch schon gestossen, kam aber damit klar. Und wenn ich deinen Code probiere kommt es zu einem Fehler. Also erstmal habe ich ihn kurz angepasst in:

Source code

1
2
3
4
5
6
Dim xmlDoc, Root

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.async = False
xmlDoc.load("c:\testxml.xml")
wscript.echo xmlDoc.selectSingleNode("//backup/machine/set/set_resource_name").text


Das ganze soll nämlich als eigenständiges VBS ablaufen. Fehler den ich erhalte: "Objekt erforderlich: 'selectSingleNode(...)'. Laufzeitfehler in Microsoft VBScript-Fehler '800a01a8'."

Ausserdem, geht es mit selectSingleNode wirklich für meine Zwecke? Vielleicht habe ich das Original-XML etwas zu stark gekürzt, aber sowohl unter dem Backup-, wie unter dem Verify-Teil wiederholen sich die Struktur. Vielleicht besseres Beispiel:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <?xml version="1.0" encoding="UTF-16" ?> 

  <backup>
   <machine>
    <machine_name>Servername</machine_name> 
     <set>
      <set_resource_name>C: SYSTEM</set_resource_name> 
     </set>
     <set>
      <set_resource_name>D: Daten</set_resource_name> 
     </set>
   </machine>
  </backup>
  
  ...
  
  <verify>
   <set>
    <set_resource_name>C: SYSTEM</set_resource_name>
   </set>
   <set>
    <set_resource_name>D: Daten</set_resource_name>
   </set>
  </verify>


Es soll mir also nicht einen einzelnen Node, sondern eben alle Nodes "Set_Resource_Name" anzeigen, aber halt nur solche die sich unter dem Backup-Teil befinden. Ich denke sobald mir jemand mal ein Beispiel geben kann das funktioniert, dass ich alle anderen Abfragen die ich plane (gesicherte Datenmenge, Errormeldungen) daraus selbstständig ableiten kann. Aber momentan tue ich mich schwer damit.

This post has been edited 1 times, last edit by "Devoid" (May 3rd 2010, 6:06pm)


4

Monday, May 3rd 2010, 6:27pm

hallo
Habe es im Browser getestet


melde dich wenn du willst über Icq

5

Tuesday, May 4th 2010, 6:46pm

Die Lösung lautet

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Dim xmlDoc, xmlFileName 
  If WScript.Arguments.Count > 0 Then 
     xmlFileName = WScript.Arguments(0)
  Else 
     xmlFileName = "C:\br\menus\testvbs.xml" 
  end If 
  Set xmlDoc = CreateObject("MSXML2.DOMDocument.4.0") 
  'WScript.Echo "Filename=" & xmlFileName 
  xmlDoc.load (xmlFileName)
  
  If xmlDoc.parseError.errorCode Then
    Wscript.Echo "Parse Error: " & vbcrlf & _ 
                 " Reason = "    & xmlDoc.parseError.reason    & vbcrlf & _ 
                 " Line = "      & xmlDoc.parseError.line      & vbcrlf & _ 
                 " linePos = "   & xmlDoc.parseError.linePos   & vbcrlf & _ 
                 " srcText = "   & xmlDoc.parseError.srcText   & vbcrlf & _ 
                 " ErrorCode = " & xmlDoc.parseError.ErrorCode & vbcrlf
      WScript.quit      
  else 
  'WScript.Echo xmlDoc.xml 
  End If  
    set nodes = xmlDoc.selectNodes("//verify/set/set_resource_name")
    'set nodes = xmlDoc.selectNodes("//backup//set/set_resource_name") 
  For Each node In nodes 
      WScript.Echo node.xml 
  Next
  WScript.Echo "The end"


Source code

1
2
3
4
5
6
Microsoft (R) Windows Script Host, Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.

<set_resource_name>C: SYSTEM im Verify</set_resource_name>
<set_resource_name>C: SYSTEM im Verify</set_resource_name>
The end

Social bookmarks