2016-11-18 2 views
0

je le code XML suivant:Déplacement d'un élément au même niveau de XML à l'aide 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> 

Ce que je veux faire est analyser le document et si l'élément NoOfDoors existe, déplacer l'élément MaxSpeed ​​au-dessus.

Donc, en prenant le XML exemple ci-dessus, je voudrais obtenir la sortie suivante:

<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> 

J'ai créé l'extrait de code suivant (parmi beaucoup d'autres tentatives) et je ne peux pas sembler le faire fonctionner :

// 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); 
      } 
     } 
     } 
    } 
} 

le code lors de son exécution donne l'erreur suivante:

java.lang.IndexOutOfBoundsException: Index: -1 

Anyon Connaissez-vous un moyen de le faire en utilisant Dom4J? Le problème que je semble avoir est quand je détache l'élément, je ne peux pas sembler juste le rajouter dans la liste que j'ai.

Répondre

0

j'ai réussi à obtenir ce travail en créant une nouvelle liste et puis itérer sur cette liste à l'aide d'une nouvelle iterator comme indiqué dans le code suivant:

// 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); 
      } 

     } 
    } 
}