2011-01-12 15 views
12

私はXMLファイルを持っており、値を変更する必要があるノード名を知っています。JavaでXMLファイルの1つの値を変更する最も良い方法は何ですか?

ノード名はipAddressです。

私はJDOMを使用してドキュメントを取得し、ノードを取得し、値を変更して書き込むか、XSLTファイルを書き込むことができます。

コードの変更値はJavaからのものですから、私の質問はどのオプションが良いですか? XMLファイルのサイズは異なる場合があります。

もう1つのXSLT関連の質問:XSLTファイルを書くことができます.XSLTファイルを書くことはできますが、XMLにあるすべてのノードをリストアップすることはできますが、ちょうどif node == ipAddressのように指定してから新しい値を適用します。 JavaからのXSLT変換?

ありがとうございます。

+1

良い質問、1:最高なXSLTプロセッサの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を使用して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> 

多くのJavaベースのXSLTプロセッサーとJavaからどのように呼び出すことができるかを理解する適切な場所は、その文書です。

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

+0

ありがとうございました。あなたは、私は値が動的に計算されているので、私はxsltファイルで直接指定しないように、私はtransformer.transform(xml、xslt、変数)のようなjavaコードから変数を介して新しいIPアドレスの値を渡すことができますか? – yart

+0

@yart:はい。 http://www.saxonica.com/documentation/using-xsl/embedding.xmlにあるSaxonのマニュアルを参照してください。 –

関連する問題