繁体   English   中英

在Java中更改XML文件中的一个值的最佳方法是什么?

[英]What is best way to change one value in XML files in Java?

我有一个XML文件,我知道我需要更改其值的节点名称。

节点名是ipAddress。

我可以使用JDOM,获取文档,获取节点并更改值并编写它,或者我可以编写XSLT文件。

代码更改值来自Java,所以我的问题是哪个选项更好? XML文件的大小可以不同。

另一个与XSLT相关的问题:是否可以编写一个XSLT文件,这样我就不会列出所有XML格式的节点,但只会指定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>

当对任何文档应用此转换时,文档的所有节点都“按原样”复制,但任何ipAddress元素的text-node子节点除外 (无论此元素在文档中的何处)。 后者将替换为外部提供的参数值$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,其文档可在以下位置找到:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM