DOM4J

2016-11-18 7 views
0

を使用してXMLと同じレベルにある要素を移動するI次の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> 

私は何をしたいことは、文書を解析し、NoOfDoors要素が存在する場合、その上にMaxSpeed要素を移動しています。私は(他の試みのロット間)以下のコードスニペットを作成していると私はちょうどそれが動作するように取得するように見えるカント

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

:だから私は次の出力を得るでしょう、上の例のXMLを取っ

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

実行が次のエラーを与えるコード:

java.lang.IndexOutOfBoundsException: Index: -1 

エニオンe Dom4Jを使ってこれを行う方法を知っていますか?私が持っているように見える問題は、私が要素を切り離したときに、私はそれを私が持っているリストに再び追加するように思えます。

答えて

0

私は、新しいリストを作成し、次のコードに示すように、新しいイテレータを使用して、このリストを反復処理することで、この作業を取得するために管理:

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

     } 
    } 
} 
関連する問題