2016-11-18 7 views
0

Ich habe die folgende XML:Verschieben eines Elements auf dem gleichen Niveau von XML Dom4J

<Vehicle xmlns="http://www.cartest.co.uk"> 
    <Car> 
    <EngineSize>2100</EngineSize> 
    <Color>Green</Color> 
    <NoOfDoors>5</NoOfDoors> 
    <MaxSpeed>150</MaxSpeed> 
    <Interior>Leather</Interior> 
    </Car> 
    <Car> 
    <EngineSize>1000</EngineSize> 
    <Color>Red</Color> 
    <NoOfDoors>3</NoOfDoors> 
    <MaxSpeed>120</MaxSpeed> 
    <Interior>Leather</Interior> 
    </Car> 
    <Car> 
    <EngineSize>1400</EngineSize> 
    <Color>Blue</Color> 
    <MaxSpeed>100</MaxSpeed> 
    <Interior>Fabric</Interior> 
    </Car> 
</Vehicle> 

Was ich tun möchte, ist das Dokument analysieren und wenn das NoOfDoors Element vorhanden ist, über den MaxSpeed ​​Element bewegen.

So das obige Beispiel XML nehmen, würde ich die folgende Ausgabe:

<Vehicle xmlns="http://www.cartest.co.uk"> 
    <Car> 
    <EngineSize>2100</EngineSize> 
    <Color>Green</Color> 
    <MaxSpeed>150</MaxSpeed> 
    <NoOfDoors>5</NoOfDoors> 
    <Interior>Leather</Interior> 
    </Car> 
    <Car> 
    <EngineSize>1000</EngineSize> 
    <Color>Red</Color> 
    <MaxSpeed>120</MaxSpeed> 
    <NoOfDoors>3</NoOfDoors> 
    <Interior>Leather</Interior> 
    </Car> 
    <Car> 
    <EngineSize>1400</EngineSize> 
    <Color>Blue</Color> 
    <MaxSpeed>100</MaxSpeed> 
    <Interior>Fabric</Interior> 
    </Car> 
</Vehicle> 

ich den folgenden Code-Snippet erstellt haben (unter vielen anderen Versuchen) und ich kann nicht scheinen, nur um es an die Arbeit :

// Parse the XML document 
doc = ParseDocument(fileName); 

// Deal with default namespace 
HashMap map = new HashMap(); 
map.put("ns", "http://www.cartest.co.uk"); 
Dom4jXPath xpath = new Dom4jXPath("//ns:Car"); 
xpath.setNamespaceContext(new SimpleNamespaceContext(map)); 

List<Node> nodes = xpath.selectNodes(doc); 

for(Node node : nodes) 
{ 
    Element element = (Element)node; 
    Iterator<Element> iterator = element.elementIterator(); 

    while(iterator.hasNext()) 
    { 
     Element currentElement = (Element)iterator.next(); 

     if(currentElement.getName().equals("NoOfDoors")) 
     { 
     List<Element> elementList = currentElement.getParent().elements();  

     for(Element elements : elementList) 
     { 
      if(elements.getName().equals("MaxSpeed")) 
      { 
       Node moveNode = elements.detach(); 
       elementList.add(elementList.indexOf(elements), (Element) moveNode); 
      } 
     } 
     } 
    } 
} 

Der Code bei der Ausführung der folgenden Fehler gibt:

java.lang.IndexOutOfBoundsException: Index: -1 

Anyon Wie kann man dies mit Dom4J machen? Das Problem, das ich zu haben scheint, ist, wenn ich das Element loslasse, ich kann es einfach nicht wieder in die Liste aufnehmen, die ich habe.

Antwort

0

ich es geschafft, diese Funktion zu erhalten, indem eine neue Liste erstellen und dann über diese Liste iterieren einen neuen Iterator wie im folgenden Code gezeigt:

// Parse the XML document 
doc = ParseDocument(fileName); 

// Deal with default namespace 
HashMap map = new HashMap(); 
map.put("ns", "http://www.cartest.co.uk"); 
Dom4jXPath xpath = new Dom4jXPath("//ns:Car"); 
xpath.setNamespaceContext(new SimpleNamespaceContext(map)); 

List<Node> nodes = xpath.selectNodes(doc); 

for(Node node : nodes) 
{ 
    Element element = (Element)node; 
    Iterator<Element> iterator = element.elementIterator(); 

    while(iterator.hasNext()) 
    { 
     Element currentElement = (Element)iterator.next(); 

     if(currentElement.getName().equals("NoOfDoors")) 
     { 
     List<Element> elementList = currentElement.getParent().elements();  

     Iterator<Element> iterator2 = element.elementIterator(); 

     while(iterator2.hasNext()) 
     { 

      Element newCurrentElement = (Element)iterator2.next(); 

      if(newCurrentElement.getName().equals("MaxSpeed")) 
      { 
       newCurrentElement.detach(); 
       elementList.add(elementList.indexOf(currentElement), newCurrentElement); 
      } 

     } 
    } 
} 
Verwandte Themen