java – 为什么XPath.evaluate返回NULL?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么XPath.evaluate返回NULL?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4089字,纯文字阅读大概需要6分钟。
内容图文
![java – 为什么XPath.evaluate返回NULL?](/upload/InfoBanner/zyjiaocheng/724/cb7df841c2e64158ab39b728c62f50c0.jpg)
当我使用下面的代码来修改xml文件时,我收到此错误:
Exception in thread "main" java.lang.NullPointerException
at ModifyXMLFile.updateFile(ModifyXMLFile.java:44)
at ModifyXMLFile.main(ModifyXMLFile.java:56)
错误发生在line:node.setTextContent(newValue);
我没有正确使用xpath吗?
这是我正在尝试更新的代码和xml文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.io.FileUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class ModifyXMLFile {
public void updateFile(String newValue){
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
try {
File f = new File("C:\\pom.xml");
InputStream in = new FileInputStream(f);
InputSource source = new InputSource(in);
Node node = (Node)xpath.evaluate("/project/parent/version/text()", source, XPathConstants.NODE);
node.setTextContent(newValue);
} catch (XPathExpressionException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String argv[]) {
new ModifyXMLFile().updateFile("TEST");
}
}
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>testgroup</groupId>
<artifactId>testartifact</artifactId>
<version>update</version>
</parent>
</project>
解决方法:
xmlns="http://maven.apache.org/POM/4.0.0"
表示XML文件中的未加前缀的元素名称位于此命名空间中.在XPath 1.0中,未加前缀的节点名称始终引用无命名空间中的节点,因此/ project / parent / version正确匹配任何内容.
要匹配XPath中的命名空间节点,您需要将前缀绑定到命名空间URI,然后在表达式中使用该前缀.对于javax.xml.xpath,这意味着创建NamespaceContext.遗憾的是,标准Java库中没有此接口的默认实现,但Spring框架提供了一个可以使用的SimpleNamespaceContext
XPath xpath = xPathfactory.newXPath();
SimpleNamespaceContext nsCtx = new SimpleNamespaceContext();
xpath.setNamespaceContext(nsCtx);
nsCtx.bindNamespaceUri("pom", "http://maven.apache.org/POM/4.0.0");
// ...
Node node = (Node)xpath.evaluate("/pom:project/pom:parent/pom:version/text()", source, XPathConstants.NODE);
也就是说,你仍然需要做更多的工作来实际修改文件,因为你当前正在加载它并修改DOM但是却没有将修改过的DOM保存在任何地方.
另一种方法可能是使用XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:pom="http://maven.apache.org/POM/4.0.0">
<xsl:param name="newVersion" />
<!-- identity template - copy input to output unchanged except when
overridden -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- override for the version value -->
<xsl:template match="pom:version/text()">
<xsl:value-of select="$newVersion" />
</xsl:template>
</xsl:stylesheet>
然后,您可以使用Transformer API使用适当的参数调用此样式表
StreamSource xslt = new StreamSource(new File("transform.xsl"));
Transformer transformer = TransformerFactory.newInstance().newTransformer(xslt);
transformer.setParameter("newVersion", newValue);
StreamSource input = new StreamSource(new File("C:\\pom.xml"));
StreamResult output = new StreamResult(new File("C:\\updated-pom.xml"));
transformer.transform(input, output);
内容总结
以上是互联网集市为您收集整理的java – 为什么XPath.evaluate返回NULL?全部内容,希望文章能够帮你解决java – 为什么XPath.evaluate返回NULL?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。