2009-10-30 3 views
1

"읽기"파일의 인터넷 상에 많은 예제가 있지만 노드 값을 "편집"하고 다시 작성하는 데는 아무 것도 찾을 수 없습니다 원본 파일로. Java를 사용하여 파일 객체의 XML 노드를 편집하는 방법

나는이처럼 보이는 작동하지 않는 XML 작가 클래스가이 예를 들어

import org.w3c.dom.Document; 
public class RunIt { 

    public static Document xmlDocument; 

    public static void main(String[] args) 
      throws TransformerException, IOException { 
     try { 
      xmlDocument = DocumentBuilderFactory.newInstance() 
        .newDocumentBuilder().parse("thor.xml");    
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } catch (SAXException ex) { 
      ex.printStackTrace(); 
     } catch (ParserConfigurationException ex) { 
      ex.printStackTrace(); 
     } 
     addElement("A", "New"); 
     writeDoc(); 
    } 

    public static void addElement(String path, String val){ 
     Element e = xmlDocument.createElement(path); 
     e.appendChild(xmlDocument.createTextNode(val)); 
     xmlDocument.getDocumentElement().appendChild(e); 
    } 

    public static void writeDoc() throws TransformerException, IOException { 
     StringWriter writer = new StringWriter(); 
     Transformer tf; 
     try { 
      tf = TransformerFactory.newInstance().newTransformer(); 
      tf.transform(new DOMSource(xmlDocument), new StreamResult(writer)); 
      writer.close(); 
     } catch (TransformerConfigurationException e) { 
      e.printStackTrace(); 
     } catch (TransformerFactoryConfigurationError e) { 
      e.printStackTrace(); 
     } 
    } 
} 

을, 이것은 XML 말할 수 있습니다 나는 내부 (는 "C"노드를 추가 할 하여 값 "새" 포함하는 노드) :

<A> 
    <B>Original</B> 
</A> 
+0

read this이 내가 생각 해낸 대답은 : http://thegreenoak.blogspot.com/2012/07/writing-string-value-to-xml-file -using.html – djangofan

답변

6

당신은 새로운 노드를 작성하는 문서 객체를 사용합니다. 제안한대로 노드를 추가하는 것은 노드를 만들고, 내용을 설정 한 다음 루트 요소에 추가하는 것입니다. 이 경우 코드는 다음과 같이 somehting을 보일 것이다

Element e = xmlDocument.createElement("C"); 
e.appendChild(xmlDocument.createTextNode("new")); 
xmlDocument.getDocumentElement().appendChild(e); 

이는 B 노드 후 권리의 새로운 아이로 C 노드를 추가합니다.

또한 Element에는 필요한 코드의 양을 줄이는 편리한 기능이 있습니다. 두 번째 라인은 위의 편집 할 대상 노드를 가져 XPath를 사용하여 당신을 포함 할 것이다 비 루트 요소를 포함하는

e.setTextContent("new"); 

더 복잡한 활동으로 대체 될 수 있었다. 대상 노드에 XPath를 사용하기 시작하면 JDK XPath 성능이 최악이라는 것을 명심하십시오. 가능할 때마다 의 XPath를 사용하여 e.getAttribute("foo")과 같은 구문을 사용하지 마십시오.

EDIT : 파일에 쓸 수있는 문자열로 문서의 서식을 다시 설정하는 작업은 다음 코드를 사용하여 수행 할 수 있습니다.

Document xmlDocument; 
StringWriter writer = new StringWriter(); 
TransformerFactory.newInstance().transform(new DOMSource(xmlDocument), new StreamResult(writer)); 
writer.close(); 
String xmlString = writer.toString(); 

EDIT : Re : 코드로 업데이트 된 질문.

'path'와 'element name'이 (가) 서로 섞여 있기 때문에 코드가 작동하지 않습니다. Document.createElement()의 매개 변수는 새 노드의 이름이며 배치 할 위치는 아닙니다. 예제 코드에서 필자는 문서 부모 요소에 노드를 추가하는 것에 대해 특별히 질문했기 때문에 적절한 노드를 찾지 못했다고 썼다. addElement()이 동작 할 것으로 기대하는 방식으로 동작하게하려면 대상 부모 노드의 xpath에 다른 매개 변수를 추가해야합니다.

코드의 다른 문제는 writeDoc() 함수에 출력이 없다는 것입니다. 이 예제에서는 XML을 String 값으로 쓰는 것을 보여줍니다. 코드를 수정하여 원하는 작성자에게 작성할 수 있지만 예제 코드에서는 StringWriter를 사용하지만 작성된 문자열은 절대로 추출하지 않습니다.

내가 다시 파일로 문서를 작성하기 위해이

public static void main(String[] args) { 
    File xmlFile = new File("thor.xml"); 
    Document xmlDocument = DocumentBuilderFactory.newInstance() 
      .newDocumentBuilder().parse(xmlFile); 
    // this is effective because we know we're adding to the 
    // document root element 
    // if you want to write to an arbitrary node, you must 
    // include code to find that node 
    addTextElement(xmlDocument.getDocumentElement(), "C", "New"); 
    writeDoc(new FileWriter(xmlFile); 
} 

public static Element addTextElement(Node parent, String element, String val){ 
    Element e = addElement(parent, element) 
    e.appendChild(xmlDocument.createTextNode(val)); 
    return e; 
} 

public static Element addElement(Node parent, String element){ 
    Element e = xmlDocument.createElement(path); 
    parent.appendChild(e); 
    return e; 
} 

public static void writeDoc(Writer writer) { 
    try { 
     Transformer tf = TransformerFactory.newInstance().newTransformer(); 
     tf.transform(new DOMSource(xmlDocument), new StreamResult(writer)); 
    } finally { 
     writer.close(); 
    } 
} 
+0

두 번째는 XPath 성능 문제입니다. 하나의 응용 프로그램에서 소수의 응용 프로그램을 사용하고 몇 초에서 4 분 정도의 실행 시간을 기록했습니다. 놀라운. –

+0

이것은 거의 내가 찾던 해답이다. 어떻게하면 파일 시스템 객체에 변경 사항을 적용 할 수 있습니까? – djangofan

+0

@ djangofan - XML ​​데이터 작성에 대한 답변을 참조하십시오 : http://stackoverflow.com/questions/1137488/ways-of-producing-xml-in-java/1137922#1137922 _ (a 대신 System.out을 사용하십시오. 'FileOutputStream') _ – McDowell

1

처럼 코드 뭔가 재 제안, 당신은 XML 시리얼이 필요하거나 직접 작성할 수 있습니다. Xerces 라이브러리를 사용하는 경우 XMLSerializer을 확인하십시오. 샘플 용도로는 DOMWriter 샘플 페이지를 확인할 수도 있습니다.Xerces에 대한 자세한 내용

, 궁극적으로

관련 문제