2011-01-12 5 views
12

XML 파일이 있는데 그 값을 변경해야하는 노드 이름을 알고 있습니다.Java에서 XML 파일의 한 값을 변경하는 가장 좋은 방법은 무엇입니까?

노드 이름은 ipAddress입니다.

JDOM을 사용하여 문서를 가져 와서 노드를 가져 와서 값을 변경하고 쓰거나 XSLT 파일을 쓸 수 있습니다.

코드 변경 값이 Java에서 변경되므로 제 질문은 어떤 옵션이 더 좋습니까? XML 파일의 크기는 다를 수 있습니다.

또 다른 XSLT 관련 질문 : XSLT 파일을 작성하여 XML에있는 모든 노드를 나열하지 않고 단지 if node == ipAddress과 같이 지정하고 새 값을 얻도록 할 수 있습니까? 자바에서 XSLT 변환?

감사합니다.

+1

좋은 질문, +1. 완전한 XSLT 솔루션에 대한 내 대답과 최고의 Java 기반 XSLT 프로세서 중 하나의 문서에 대한 링크를 참조하십시오. –

+0

"최고"란 무엇을 의미합니까? 가장 편리한 (가장 단순한) 성능, 가장 큰 성능, 대용량 파일에 유용합니까? XSLT 및 트리 모델 (DOM)은 편리 할 수 ​​있지만 많은 메모리를 사용하며 상대적으로 느립니다 (예를 들어). – StaxMan

+0

색슨은 꽤 많이 최고입니다. 그것은 DOM보다 작은 메모리 내 모델을 가지고 있으며, 거대한 파일을위한 스트리밍을 지원하고, 뛰어난 옵티 마이저를 가지고 있으며, XSLT 1, XSLT 2, XQuery, XML Schema를 지원하며, 몇몇 새로운 드래프트 표준을 지원합니다. – lavinio

답변

6

표준 org.w3c.dom API를 사용하여 DOM을 얻을 수 있습니다. 그런 다음 표준 javax.xml.xpath API를 사용하여 노드를 가져옵니다. 그런 다음 javax.xml.transform API를 사용하여 다시 작성하십시오. 같은

뭔가 :

import java.io.File; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     Document document = dbf.newDocumentBuilder().parse(new File("input.xml")); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     XPathExpression expression = xpath.compile("//A/B[C/E/text()=13]"); 

     Node b13Node = (Node) expression.evaluate(document, XPathConstants.NODE); 
     b13Node.getParentNode().removeChild(b13Node); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     t.transform(new DOMSource(document), new StreamResult(System.out)); 
    } 
} 
4

XSLT 솔루션은 :

이 변환이 모든 문서에 적용되는
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="pNewIpAddress" select="'192.68.0.1'"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ipAddress/text()"> 
    <xsl:value-of select="$pNewIpAddress"/> 
    </xsl:template> 
</xsl:stylesheet> 

, 문서의 모든 노드를 제외하고 "있는 그대로"복사됩니다 모든 ipAddress 요소의 텍스트 노드 하위 요소 (이 요소가 문서의 어디에 있든 관계 없음) 후자는 $pNewIpAddress이라는 외부에서 제공된 매개 변수의 값으로 대체됩니다.

예를 들어, 변환이 XML 문서에 대해 적용되는 경우 :

<t> 
    <a> 
     <b> 
      <ipAddress>127.0.0.1</ipAddress> 
     </b> 
     <c/> 
    </a> 
    <d/> 
</t> 

이 원하는 정확한 결과가 생성됩니다

있습니다
<t> 
    <a> 
     <b> 
     <ipAddress>192.68.0.1</ipAddress> 
     </b> 
     <c/> 
    </a> 
    <d/> 
</t> 

많은 자바 기반의 XSLT 프로세서 및 Java에서 호출 할 수있는 방법을 이해할 수있는 적절한 위치는 해당 설명서입니다. 최고의 같은 XSLT 프로세서 중 하나는 색슨이며, 해당 설명서에서 찾을 수 있습니다 :

http://www.saxonica.com/documentation/documentation.xml

+0

답변 해 주셔서 대단히 감사합니다. transformer.transform (xml, xslt, variable)과 같은 java 코드에서 변수를 통해 새 IP 주소의 값을 전달할 수 있는지 알고 계십니까? xslt 파일에서 직접 값을 동적으로 계산하지 않으므로 지정하지 않겠습니까? – yart

+0

@ 독자 : 예. Saxon 설명서는 다음을 참조하십시오. http://www.saxonica.com/documentation/using-xsl/embedding.xml –

관련 문제