Erste Schritte Jdom AusgabeSchleife

Hallo,

ich bin absoluter Einsteiger was JDOM angeht.
Meine Aufgabe ist es, eine XML Datei auszulesen, in der bestimmte gescannte IP Adressen und zu jeder IP Adresse Security Schwachstellen aufgelistet werden.
So weit so gut ;)
Ich habe es bis jetzt geschafft die XML Datei einzulesen und mir die Datenfelder anzuzeigen die für mich relevant sind. Mein eigentliches Problem beginnt dann ab Zeile 45 im Quellcode.
Zu jeder IP Adresse gibt es mehrere Schwachstellen. Ich habe also begonnen eine for Schleife zu basteln, die mir jede Stelle ausgeben soll. Die Schleife läuft jetzt aber nur einfach so oft durch wie es Schwachstellen gibt. Auf dem Display wird dann einfach x mal der Inhalt der ersten Schwachstelle angezeigt.
Ich weis jetzt leider nicht, welche Möglichkeiten JDOM bietet die Schwachstellen in ein Array oder List zwischenzuspeichern und mit allen Details auszugeben. Vieleicht gibt es aber ja auch einfach die Möglichkeit meine Variable "i"durchzureichen und jedesmal den Inahlt an der "i"ten Stelle auszugeben.
Wie gesagt ich bin noch absoluter Anfänger und für jede Hilfe super dankbar!

Viele Grüße Björn

Java:
package XMLEinlesen;

import java.util.Iterator;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class Reader {
	
	  public static void main( String[] args ) throws Exception
	  {
	    Document doc = new SAXBuilder().build( "Host_Data.xml" );
	    Element Info = doc.getRootElement();

	    
	    System.out.println("Scaninformationen:");
	    Element ScanInfo = Info.getChild( "Jobs" );
	    Attribute ScanName = ScanInfo.getAttribute( "ScanName" );
	    System.out.println( "ScanName: " + ScanName.getValue() );
	    Attribute StartTime = ScanInfo.getAttribute( "StartTime" );
	    System.out.println( "StartTime: " + StartTime.getValue() );
	    Attribute EndTime = ScanInfo.getAttribute( "EndTime" );
	    System.out.println( "EndTime: " + EndTime.getValue() ); 
	    
	    System.out.println();
	    System.out.println("Systeme mit Schwachstellen:");
	    Element HostInfo = Info.getChild( "HostData" ).getChild("Host");
	    Attribute IPAdress = HostInfo.getAttribute( "IPAddress" );
	    System.out.println( "IPAddress: " + IPAdress.getValue() ); 
	    Attribute OSName = HostInfo.getAttribute( "OSName" );
	    System.out.println( "OSName: " + OSName.getValue() );
	    Attribute DNSName = HostInfo.getAttribute( "DNSName" );
	    System.out.println( "DNSName: " + DNSName.getValue() );
	    Attribute NBName = HostInfo.getAttribute( "NBName" );
	    System.out.println( "NBName: " + NBName.getValue() );
	    
	   
	    System.out.println("Schwachstellen:");
	    
	    Element Vulns =Info.getChild( "HostData" ).getChild("Host").getChild("VulnsFound");
	    for(int i = 0; i < Vulns.getChildren().size(); i++) 
	    { 	
	     
	    Element VulnsInfo = Vulns.getChild("Vuln");
	    Attribute id = VulnsInfo.getAttribute( "id" );
	    Attribute VulnName = VulnsInfo.getAttribute("VulnName");
	    Element RiskInfo = Vulns.getChild("Vuln").getChild("Risk");
	    String risk = RiskInfo.getText();
	    Element CVEInfo = Vulns.getChild("Vuln").getChild("CVE");
	    String CVE = CVEInfo.getText();
	   
	    System.out.println( "ID: " + id.getValue()+ " VulnName: "+ VulnName.getValue()+ " Risklevel: "+risk +" CVE Info: "+ CVE);
	  	}
	    
	  }
	  
}
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Du verwendest in der for-Schleife niemals den laufindex i. getChild liefert Dir dann immer das erste Element zurück getChildren(..).get(i) müsste gehen. Oder Du benutzt für die Iteration die Syntax mit Doppelpunkt (for Element element : elements). Hoffe, das bringt Dich auf die richtige Spur. Falls nicht, sei bitte so nett und poste mal ein XML-Schnipsel. Das macht es leichter, die Struktur des von Dir geparsten Dokuments nachzuvollziehen.
 
Hallo,

hier der XML Teil:[XML]
<?xml version="1.0" encoding="UTF-8" ?>
- <ROOT xmlns:rsd="urn:www.mcafee.com:foundstone:reportsectiondescription">
<ReportInfo CreationDate="2011-09-12 13:10:29 UTC" ReportType="Network Inventory" />
<Jobs JobID="510" ScanName="BSTestPCIScan" ScanType="External" StartTime="2011-09-12 12:36:07 UTC" EndTime="2011-09-12 13:10:25 UTC" />
- <HostData>
- <Host IPDword="" IPAddress="" OSName="" DNSName="[Unknown]" NBName="" NBWorkGroupName="">
- <VulnsFound>
+ <Vuln id="864" VulnName="NetBIOS NBTSTAT -A">
<Risk>3</Risk>
<ServiceName>netbios-ns</ServiceName>
<Port>137</Port>
<Protocol>udp</Protocol>
<Description>It is possible to retrieve NetBIOS Name Service information.</Description>
<CVE>CVE-MAP-NOMATCH</CVE>
</Vuln>
+ <Vuln id="955" VulnName="Microsoft Windows Terminal Service">
<Risk>0</Risk>
<ServiceName>ms-term-service</ServiceName>
<Port>3389</Port>
<Protocol>tcp</Protocol>
<Description>Microsoft Windows Terminal service has been detected on the target host.</Description>
<CVE>CVE-MAP-NOMATCH</CVE>
</Vuln>
</VulnsFound>
</Host>
[/XML]

Vielen Dank!
 
Danke erst mal für deine schnelle Antwort:)

Doch wenn ich:
Java:
Element VulnsInfo = Vulns.getChild("Vuln");
durch zum Beispiel das hier ersetze:
Java:
Element VulnsInfo = Vulns.getChildren("Vuln").get(i);
macht er mir aus dem Element eine Fehlermeldung "Can not convert From Objekt to Element". Also muss ich das wohl anpassen. Die Frage ist nur wie.. :oops:
 
N

nillehammer

Gast
JDOM ist da leider etwas rückständig und verwendet keine Generics. Deswegen musst Du das get(i) auf Element casten. In etwa so:
[Java]
Element VulnsInfo = (Element) Vulns.getChildren("Vuln").get(i);
[/Java]
Wichtig ist, dass die Methode getChildren("Vuln") eine List zurück liefert, in der nur Element drinnen ist und nicht z.B. Attribute dieses Namens. Dann würde es eine ClassCastException geben. Aber nach kurzem Überfliegen Deines XMLs, denke ich passiert das wohl nicht.
 

Ähnliche Java Themen

Neue Themen


Oben