2016-06-29 3 views
0

У меня есть следующий XMLJava XML Вставьте родительский узел

<Root> 
    <Page> 
     <Object ref="a"></Object> 
     <Object ref="b"></Object> 
    </Page> 
</Root> 

Я хочу, чтобы преобразовать в

<Root> 
    <Page> 
     <ObjectGroup ref="a"> 
      <Object ref="a"/> 
     </ObjectGroup> 
     <ObjectGroup ref="b"> 
      <Object ref="b"/> 
     </ObjectGroup> 
    </Page> 
</Root> 

В основном я хочу, чтобы ввести новый родительский узел. Я использовал ниже способ, но это введение больше родителей

private static void loadRoots(String xMLPath) { 
     Document doc = Migrate.initTreeOpFromString(xMLPath); 
     Element rootElement = doc.getDocumentElement(); 
     loadPage(rootElement); 
     Migrate.finishTreeOp(doc, "D:\\a.xml"); 
    } 

    private static void loadPage(Element root) { 
     NodeList pageNodes = root.getChildNodes(); 
     for (int j = 0; j < pageNodes.getLength(); j++) { 
      Node pageNode = pageNodes.item(j); 
      if (pageNode.getNodeType() == Node.ELEMENT_NODE) { 
       loadObject((Element) pageNode); 
      } 
     } 
    } 

    private static void loadObject(Element pageNode) { 
     NodeList objectNodes = pageNode.getChildNodes(); 
     for (int j = 0; j < objectNodes.getLength(); j++) { 
      Node objectNode = objectNodes.item(j); 
      if (objectNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element objGroup = pageNode.getOwnerDocument().createElement("ObjectGroup"); 
       String ref = objectNode.getAttributes().getNamedItem("ref").getTextContent(); 
       objGroup.setAttribute("ref", ref); 
       pageNode.removeChild(objectNode); 
       objGroup.appendChild(objectNode); 
       pageNode.appendChild(objGroup); 
      } 
     } 
    } 

Но выход за это

<Root> 
    <Page> 
     <ObjectGroup ref="b"> 
      <Object ref="b"/> 
     </ObjectGroup> 
     <ObjectGroup ref="a"> 
      <ObjectGroup ref="a"> 
       <ObjectGroup ref="a"> 
        <Object ref="a"/> 
       </ObjectGroup> 
      </ObjectGroup> 
     </ObjectGroup> 
    </Page> 
</Root> 

, который не то, что я хотел. Как это решить?

+0

Я бы использовал XSLT. Вы можете определить шаблон для этой упаковки. – Fildor

+0

@ Fildor спасибо, но я получил решение – Madhan

+0

Если вы использовали JAXB, ваша жизнь была бы намного проще. – Teddy

ответ

0

Это моя ошибка. Я должен был использовать insertBefore. То, что сделал трюк

private static void loadObject(Element pageNode) { 
     NodeList objectNodes = pageNode.getChildNodes(); 
     for (int j = 0; j < objectNodes.getLength(); j++) { 
      Node objectNode = objectNodes.item(j); 
      if (objectNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element objGroup = pageNode.getOwnerDocument().createElement("ObjectGroup"); 
       String ref = objectNode.getAttributes().getNamedItem("ref").getTextContent(); 
       objGroup.setAttribute("ref", ref); 
       pageNode.insertBefore(objGroup, objectNode); 
       objGroup.appendChild(objectNode); 
      } 
     } 
    } 
Смежные вопросы