我有一个XML文件,我知道需要更改值的节点名称。
节点名称是ipAddress。
我可以使用JDOM获取文档、获取节点并更改值然后写入,或者我可以编写一个XSLT文件。
代码更改值来自Java,所以我的问题是哪个选项更好?XML文件的大小可能不同。
另一个与XSLT相关的问题:是否可以编写一个XSLT文件,使得我不必列出XML中的所有节点,而只需指定像if node == ipAddress
这样的条件,然后采用新值,如何从Java应用XSLT转换?
谢谢。
我有一个XML文件,我知道需要更改值的节点名称。
节点名称是ipAddress。
我可以使用JDOM获取文档、获取节点并更改值然后写入,或者我可以编写一个XSLT文件。
代码更改值来自Java,所以我的问题是哪个选项更好?XML文件的大小可能不同。
另一个与XSLT相关的问题:是否可以编写一个XSLT文件,使得我不必列出XML中的所有节点,而只需指定像if node == ipAddress
这样的条件,然后采用新值,如何从Java应用XSLT转换?
谢谢。
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>
当应用此转换于任何文档时,文档的所有节点都会被“原样”复制,除了任何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处理器之一是Saxon,其文档可以在以下网址找到: