【问题标题】:Update value of Xml tag using Xpath in Java在 Java 中使用 Xpath 更新 Xml 标记的值
【发布时间】:2014-10-31 08:07:13
【问题描述】:

我正在尝试使用 Java 中的 XPath 更改 XML 文件的特定标记的值。我正在尝试使用 XpathFactory 来实现这一点,但无法做到。如果有更好的方法,请纠正我。

JAVA 代码..

 public class MavenMetadataReader {


/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws XMLStreamException {


     Scanner user_input = new Scanner( System.in );

     String updated_pom_version;
     System.out.println("Enter updated version:");
     updated_pom_version = user_input.next( );

     File xpath=new File("D:\\Lucy\\trunk\\pom.xml");

     XPathFactory xfactory = XPathFactory.newInstance();
     XPath xpathObj = xfactory.newXPath();
     Node node;

     try {
          node = (Node)xpathObj.evaluate(xpath, doc, XPathConstants.NODE);
     } catch (XPathExpressionException e) {
          throw new RuntimeException(e);
     }

     node.setTextContent(elementValue);

XML 文件..

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.avocent</groupId>
      <artifactId>common-configurations</artifactId>
      <version>0.0.4</version>
   </parent>
   <groupId>com.avocent.commonplatform.cps.symbols</groupId>
   <artifactId>GDDResources</artifactId>
   <version>4.0.0.129-SNAPSHOT</version>
   <description>Resources for init data strings</description>
   <packaging>jar</packaging>
   <properties>
   <src>${basedir}</src>
   <dst>${basedir}/target/classes</dst>
 </properties>
</project>

XML 文件中的预期变化。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.avocent</groupId>
      <artifactId>common-configurations</artifactId>
      <version>0.0.4</version>
   </parent>
   <groupId>com.avocent.commonplatform.cps.symbols</groupId>
   <artifactId>GDDResources</artifactId>
   <version>3.6.10</version>    **<-- Changes are to be made in second version tag, not the first**  
   <description>Resources for init data strings</description>
   <packaging>jar</packaging>
   <properties>
   <src>${basedir}</src>
   <dst>${basedir}/target/classes</dst>
   </properties>
   </project>

输入的用户值应该只重写第二个“版本”标签的值。请帮助

【问题讨论】:

  • 如果不知道您对变量 xpath 使用了什么,这很难提供帮助
  • 我已根据我在代码中使用的内容进行了更改。
  • xpathObj.evaluate(xpath, doc, XPathConstants.NODE); -- 您没有在问题的任何地方包含xpath 的值。
  • 您的 XML 无效,解析时会出错。要更正,请使用&lt;/properties&gt; 关闭&lt;properties&gt; 标记。

标签: java xml xpath xml-parsing


【解决方案1】:

试试这个:

try {

    // Create a document by parsing a XML file
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    Document document = builder.parse(new File("C:/temp/test.xml"));

    // Get a node using XPath
    XPath xPath = XPathFactory.newInstance().newXPath();
    String expression = "/project/version";
    Node node = (Node) xPath.evaluate(expression, document, XPathConstants.NODE);

    // Set the node content
    node.setTextContent("Whatever I want to write");

    // Write changes to a file
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult(new File("C:/temp/test-updated.xml")));

} catch (Exception e) {
    // Handle exception
}

更新

为了使上述代码正常工作,您必须使用以下导入:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

【讨论】:

  • 以上代码将编辑两个版本标签的值,但我只想更改第二个“版本”标签的值..
  • @Lucy,现在试试。我用/project/version替换了/project/parent/version
  • 你能把你的代码放在try catch块中吗..上面的代码抛出了很多异常..
  • 当我使用你的代码时,我得到了 2 个错误。在第三行它说“Cast..parse(..) to document”,在最后一行代码它说“Cast. .document to node"..为什么会这样??
  • @Lucy,请给我看堆栈跟踪。我在发布之前已经测试了代码并且工作得很好。
猜你喜欢
  • 2011-09-01
  • 2013-12-27
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2018-03-17
  • 2011-03-04
  • 1970-01-01
  • 2015-11-06
相关资源
最近更新 更多