Hallo,
ich hänge momentan an einem kleinen Problem.
Zur Situation, ich habe einen XML-Baum (verwende JAXB) und möchte diesen nun durchlaufen um einen Weg zu finden. (Hatte dazu einen anderen Thread: http://www.java-forum.org/softwareentwicklung/109545-weg-zwischen-2-knoten-xml-jaxb.html)
Ich habe verschiedene Objekte "Switch", jedes dieser Objekte hat eine Liste von Ports, an denen andere Switches hängen. Ich habe die Struktur mal beispielhaft skizziert:
Mein Problem ist es jetzt, das Suchen vom Weg passend zu implementieren. Ich muss den Weg von 2 Knotenpunkten zur Wurzel bestimmen. D.h. ich muss zunächst den Baum/die Listen durchlaufen um das Element zu finden. Dann muss ich das Vaterelement von diesem herausfinden, dann das Vaterelement vom Vaterelement usw.
Die genaue Struktur wäre:
Eine Liste Ports, jeder Port hat ein Element Kabel, jedes Element Kabel hat ein Element Device oder Switch.
Ich starte also mit meiner Liste von Ports(rootSwitchPorts) vom Rootelement. Diese durchlaufe ich und untersuche für jeden Port u in rootSwitchPorts zunächst ob ein Switch oder ein Device enthalten sind und falls Device ob u.getCable().getDevice().getID() == gesuchte ID ist. Bis hierhin klappt dann auch alles. Das Problem ist jetzt das Zusammensetzen/bzw. das Herausfinden der Vaterelemente.
Ist u.getCable().getDevice().getID() == sourceID soll dieses also mein erstes Element in der Liste werden, danach muss ich die ID des Elements herausfinden in dessen Liste u ich mich gerade befinde.
Beispielhaft nochmal an der Skizze von vorhin (Wobei hier dann nur der Weg von 5 zu 1 gesucht wird):
Und mal ein kleiner Ansatz von mir (Wobei hier wie gesagt bisher nur die Suche nach dem Element mit entsprechender sourceID richtig klappt):
Und hier noch das entsprechende XML Schema:
[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Switch" type="SwitchType"/>
<xsd:element name="Device" type="DeviceType"/>
<xsd:complexType name="SwitchType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Delay" type="xsd:int"/>
<xsd:element name="Jitter" type="xsd:int"/>
<xsd:element name="Port" type="PortType" minOccurs="3" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:int"/>
<xsd:attribute name="IncomePortNumber" type="xsd:int"/>
</xsd:complexType>
<xsd:complexType name="PortType">
<xsd:sequence>
<xsd:element name="Cable" type="CableType"/>
</xsd:sequence>
<xsd:attribute name="PortNumber" type="xsd:int"/>
</xsd:complexType>
<xsd:complexType name="CableType">
<xsd:sequence>
<xsd:element name="Delay" type="xsd:int"/>
<xsd:element ref="Switch" minOccurs="0" maxOccurs="1"/>
<xsd:element ref="Device" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="Name" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="DeviceType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Delay" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:int"/>
</xsd:complexType>
</xsd:schema>[/XML]
Könnte mir da jemand einen Tipp geben wie ich vorgehen könnte?
Grüße
Fawkes
ich hänge momentan an einem kleinen Problem.
Zur Situation, ich habe einen XML-Baum (verwende JAXB) und möchte diesen nun durchlaufen um einen Weg zu finden. (Hatte dazu einen anderen Thread: http://www.java-forum.org/softwareentwicklung/109545-weg-zwischen-2-knoten-xml-jaxb.html)
Ich habe verschiedene Objekte "Switch", jedes dieser Objekte hat eine Liste von Ports, an denen andere Switches hängen. Ich habe die Struktur mal beispielhaft skizziert:

Mein Problem ist es jetzt, das Suchen vom Weg passend zu implementieren. Ich muss den Weg von 2 Knotenpunkten zur Wurzel bestimmen. D.h. ich muss zunächst den Baum/die Listen durchlaufen um das Element zu finden. Dann muss ich das Vaterelement von diesem herausfinden, dann das Vaterelement vom Vaterelement usw.
Die genaue Struktur wäre:
Eine Liste Ports, jeder Port hat ein Element Kabel, jedes Element Kabel hat ein Element Device oder Switch.
Ich starte also mit meiner Liste von Ports(rootSwitchPorts) vom Rootelement. Diese durchlaufe ich und untersuche für jeden Port u in rootSwitchPorts zunächst ob ein Switch oder ein Device enthalten sind und falls Device ob u.getCable().getDevice().getID() == gesuchte ID ist. Bis hierhin klappt dann auch alles. Das Problem ist jetzt das Zusammensetzen/bzw. das Herausfinden der Vaterelemente.
Ist u.getCable().getDevice().getID() == sourceID soll dieses also mein erstes Element in der Liste werden, danach muss ich die ID des Elements herausfinden in dessen Liste u ich mich gerade befinde.
Beispielhaft nochmal an der Skizze von vorhin (Wobei hier dann nur der Weg von 5 zu 1 gesucht wird):

Und mal ein kleiner Ansatz von mir (Wobei hier wie gesagt bisher nur die Suche nach dem Element mit entsprechender sourceID richtig klappt):
Java:
public List<Integer> createPath(List<PortType> rootSwitchPorts, int sourceID){
List<Integer> tempSwitchPorts = new ArrayList<Integer>();
for(PortType u : rootSwitchPorts){ //currentSwitch = rootSwitch
//System.out.println(u.getCable().getSwitch().getID());
if(u.getCable().getDevice() != null)
if(u.getCable().getDevice().getID() == sourceID)
{
//System.out.println(u.getCable().getDevice().getID());
tempSwitchPorts.add(u.getCable().getDevice().getID());
return tempSwitchPorts;
}
if(u.getCable().getSwitch() != null)
{
tempSwitchPorts = createPath(u.getCable().getSwitch().getPort(), sourceID);
if(tempSwitchPorts.get(0) != null)
if(tempSwitchPorts.get(0) == sourceID)
tempSwitchPorts.add(u.getCable().getSwitch().getID());
}
}
tempSwitchPorts.add(-1);
return tempSwitchPorts;
}
Und hier noch das entsprechende XML Schema:
[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Switch" type="SwitchType"/>
<xsd:element name="Device" type="DeviceType"/>
<xsd:complexType name="SwitchType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Delay" type="xsd:int"/>
<xsd:element name="Jitter" type="xsd:int"/>
<xsd:element name="Port" type="PortType" minOccurs="3" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:int"/>
<xsd:attribute name="IncomePortNumber" type="xsd:int"/>
</xsd:complexType>
<xsd:complexType name="PortType">
<xsd:sequence>
<xsd:element name="Cable" type="CableType"/>
</xsd:sequence>
<xsd:attribute name="PortNumber" type="xsd:int"/>
</xsd:complexType>
<xsd:complexType name="CableType">
<xsd:sequence>
<xsd:element name="Delay" type="xsd:int"/>
<xsd:element ref="Switch" minOccurs="0" maxOccurs="1"/>
<xsd:element ref="Device" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="Name" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="DeviceType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Delay" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:int"/>
</xsd:complexType>
</xsd:schema>[/XML]
Könnte mir da jemand einen Tipp geben wie ich vorgehen könnte?
Grüße
Fawkes