JavaのXMLファイルの1つの値を変更する最良の方法は何ですか?
質問
XMLファイルがあり、値を変更する必要があるノード名がわかっています。
nodenameはiPaddressです。
JDOMを使用したり、ドキュメントを取得したり、ノードを取得したり、値を変更したり、XSLTファイルを書くことができます。
コードの変更値はJavaから得られるので、私の質問はどのオプションが優れていますか? XMLファイルのサイズは異なる場合があります。
別のXSLT関連の質問:XSLTファイルを記述することは可能ですか? if node == ipAddress
, 、次に、新しい値を取得し、JavaからXSLT変換をどのように適用しますか?
ありがとうございました。
解決
標準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));
}
}
他のヒント
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>
この変換が任意のドキュメントに適用されると、ドキュメントのすべてのノードは、任意のテキストノードの子を除いて「AS-IS」をコピーします 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からどのように呼び出すことができるかを理解するための適切な場所がドキュメントです。このようなXSLTプロセッサの最高の1つはSaxonであり、そのドキュメントは次のとおりです。