2011-08-11 7 views
4

간단한 간단한 함수를 만들어서 항목을 제거하고 싶습니다. 매우 간단한 xml 파일이 있습니다. 다음은 내 XML 파일입니다.자바 xml 항목 제거

<?xml version="1.0"?> 
<book> 
    <person> 
    <name>Person 1</name> 
    </person> 
    <person> 
    <name>Person 2</name> 
    </person> 
    <person> 
    <name>Person 3</name> 
    </person> 
    <person> 
    <name>Person 4</name> 
    </person> 
</book> 

단순히 파일에서 하나의 이름을 삭제하는 메소드를 호출하고 싶습니다. XML에 익숙하지 않지만 독자와 작성자를 만들었지 만 파일에서 항목을 삭제하는 방법을 만드는 데 문제가 있습니다. 내가 내 말 항목을 삭제 말할

:

deleteItem("Person 3"); 

그리고 XML 파일이 변경됩니다에 :

<?xml version="1.0"?> 
    <book> 
     <person> 
     <name>Person 1</name> 
     </person> 
     <person> 
     <name>Person 2</name> 
     </person> 
     <person> 
     <name>Person 4</name> 
     </person> 
    </book> 

내가 잘못 했는가하는 것 :

public static void removeName(String personName) throws ParserConfigurationException, IOException, SAXException{ 
     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse (new File("test.xml")); 

     NodeList nodes = doc.getElementsByTagName("person"); 
     for (int i = 0; i < nodes.getLength(); i++) {  
      Element person = (Element)nodes.item(i); 
      Element name = (Element)person.getElementsByTagName("name").item(0); 
      String pName = name.getTextContent(); 
      if(pName.equals(personName)){ 
       person.getParentNode().removeChild(person); 
      } 
     } 

    } 

답변

6

사용하여 DOM :

public static void main(String[] args) throws Exception { 
    final String xml = "<book> " + 
     "<person> " + 
      "<name>Person 1</name> " + 
     "</person> " + 
     "<person> " + 
      "<name>Person 2</name> " + 
     "</person> " + 
     "<person> " + 
      "<name>Person 3</name> " + 
     "</person> " + 
     "<person> " + 
      "<name>Person 4</name> " + 
     "</person> " + 
     "</book>"; 

     DocumentBuilderFactory dbf = 
      DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xml)); 

     Document doc = db.parse(is); 
     deletePerson(doc, "Person 3"); 
     printXML(doc); 
    } 

    public static void deletePerson(Document doc, String personName) { 
    // <person> 
    NodeList nodes = doc.getElementsByTagName("person"); 

    for (int i = 0; i < nodes.getLength(); i++) { 
     Element person = (Element)nodes.item(i); 
     // <name> 
     Element name = (Element)person.getElementsByTagName("name").item(0); 
     String pName = name.getTextContent(); 
     if (pName.equals(personName)) { 
     person.getParentNode().removeChild(person); 
     } 
    } 
    } 

    public static void printXML(Document doc) 
    throws TransformerException { 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

    StreamResult result = new StreamResult(new StringWriter()); 
    DOMSource source = new DOMSource(doc); 
    transformer.transform(source, result); 

    String xmlString = result.getWriter().toString(); 
    System.out.println(xmlString); 
    } 
1

처음 좋은 텍스트가있는 항목을 선택하십시오.

이 사용 된 XPath 구문을 그렇게하려면 :/책/사람 [이름/텍스트() = "사람 3"그 후

을, 당신은 단순히 부모에서 제거 할 노드를해야합니다.

InputSource source = new InputSource(new FileInputStream(##your file##)); 

XPathFactory builder = XPathFactory.newInstance(); 
XPath xpath = builder.newXPath(); 

String label = "Person 3"; 
XPathExpression exp = xpath.compile("/book/person[name/text() = \"" + label +"\"]"); 

Node node = (Node) exp.evaluate(source, XPathConstants.NODE); 
node.getParentNode().removeChild(node); 
0

는 기본적으로 문서를 구문 분석하고 요소를 얻고 그것을 제거 할 필요가 : 여기

은 (하지 테스트) 코드입니다.
javax.xml.parsers 및 javax.xml.transform 패키지를 사용하여이 작업을 수행 할 수 있습니다.

File file = new File(xmlFile); 

xmlfile은 xml 파일의 이름을 저장합니다. 파일을 문서로 읽으십시오.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(xmlFile); 
    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    Transformer tFormer = tFactory.newTransformer();<br> 

다음 요소를 가져 와서 아래 그림과 같이 제거하십시오.

Element element = (Element)doc.getElementsByTagName(remElement).item(0); 
// Remove the node 
    element.getParentNode().removeChild(element);