2017-11-22 2 views
1

나는 간단한 데이터 세트를 가진 xml을 가지고 있습니다. 이 데이터는 간단한 테이블에 표시되며 각 데이터 행에는 xml (<xsl:value-of select="position()" />)의 위치를 ​​기반으로 테이블의 ID가 할당됩니다. 내 데이터가 아니기 때문에 데이터에 id 속성을 추가 할 수는 없지만이 위치를 기반으로 요소를 찾아 제거해야합니다.위치별로 요소 제거

public class Delete extends HttpServlet { 

private final String XML_FILE = "data.xml"; 

public void init() throws ServletException { 

} 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // Disable browser caching 
    response.setHeader("Cache-Control", "private, no-store, no-cache, must-revalidate"); 
    response.setHeader("Pragma", "no-cache"); 
    response.setDateHeader("Expires", 0); 

    String index = request.getParameter("delete"); 

    try { 
     // Load the current data.xml 
     SAXBuilder builder = new SAXBuilder(); 
     Document xml_document = builder.build(new File(getServletContext().getRealPath("/") + XML_FILE)); 

     Element root = xml_document.getRootElement(); 
     root.removeChild(index); 


     XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
     outputter.output(xml_document, new FileWriter(getServletContext().getRealPath("/") + XML_FILE)); 
    } 
    catch(Exception ex) {} 

    // Once we have processed the input we were given 
    // redirect the web browser to the main page. 
    response.sendRedirect("/"); 
} 

public void destroy() { 

} 

}

이 코드는 올바른 데이터를 제거하지 않습니다. 누구든지 그 위치에 따라 루트 요소의 하위를 찾는 법을 알고 있습니까?

@rolfl는

int index = Integer.parseInt(delete); 
Element root = xml_document.getRootElement(); 
root.getChildren().remove(index); 

이 어떤 요소를 제거하지 않습니다.

답변

0

이것이 작동하는 방식입니다. 그것의 위대한 솔루션이지만 작동하는지 확실하지 않습니다.

 SAXBuilder builder = new SAXBuilder(); 
     Document xml_document = builder.build(new File(getServletContext().getRealPath("/") + XML_FILE)); 

     // Get root element 
     Element root = xml_document.getRootElement(); 

     // Create a list of the children of the root element 
     List<Element> kids = root.getChildren(); 

     // Interate through list of elements and delete (detach) the element at position index. 
     int i = 1; 
     for (Element element : kids) 
     { 
      if(i == index) 
      { 
       element.detach(); 
       break; 
      } 
      else 
      { 
      i = i + 1; 
      }    
     } 

나는 그것의 목록은 내가 삭제되는 요소의 인덱스에 도달 할 때까지

List<Element> kids = root.getChildren(); 

그런 다음이 목록을 통해 반복 어린이 요소의 제작

Element root = xml_document.getRootElement(); 

과 루트 요소를 가지고 이 요소에 대해 다음을 수행했습니다.

  int i = 1; 
      for (Element element : kids) 
      { 
       if(i == index) 
       { 
        element.detach(); 
        break; 
       } 
       else 
       { 
       i = i + 1; 
       }    
      } 

누군가를 쉽게 제거 할 수있는 방법을 보여주기 위해이를 업데이트 할 수 있다면 그렇게하십시오. 그것은 반복없이 요소를 분리하는 더 쉬운 방법이 있어야하는 것처럼 느껴집니다. 어쨌든, 내가 말한대로 작동합니다.

1

여기에서 문제는 프로세스가 인덱스로 문자열을 제거하고 그 다음에 removeChild(String) 메서드를 호출하는 것입니다. 요소 태그 이름이 whatever (string) 값인 첫 번째 자식을 찾습니다. 색인에 있습니다.

int index = Integer.parseInt(request.getParameter("delete")); 
root.getChildren().remove(index); 

은 설명서를 참조하십시오 : 당신이 원하는 무엇

대신, 뭔가처럼 .... 목록으로 루트의 아이를 치료 한 후 int로 인덱스를 변환하는 것입니다 getChildren().

+0

좋은 정보이지만 여전히 내가 뭘했는지 달성하지 못합니다. – Finchy70