Apache XmlBeans执行XPATH查询抛出java.lang.RuntimeException问题求解
问题根因
- 命名空间声明语句末尾缺少分号,不符合XMLBeans的XPath语法要求
- 依赖不匹配:XMLBeans本身不内置XPath执行引擎,你引入的旧版Saxon包版本混乱存在类冲突,无法被XMLBeans识别加载。
解决步骤
1. 修正pom.xml依赖
替换原有依赖配置,删掉之前手动引入的零散旧版Saxon相关依赖:
<dependencies> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>10.6</version> </dependency> </dependencies>
2. 清理冲突依赖
删除本地Maven仓库中旧的Saxon缓存文件:删除~/.m2/repository/net/sf/saxon目录,再执行mvn clean install拉取新依赖。
3. 修正Java代码
补充命名空间声明末尾缺失的分号,同时增加空判断避免索引越界:
import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) { File file = new File("test.xml"); try { XmlObject xoobj = XmlObject.Factory.parse(file); // 命名空间声明末尾必须加分号 String declareNameSpaces = "declare namespace v='urn:schemas-microsoft-com:vml'; "; String xpathFilter = "//v:shape[contains(@id,'PowerPlusWaterMarkObject')]/v:textpath/@string"; XmlObject[] arr = xoobj.selectPath(declareNameSpaces + xpathFilter); if (arr.length > 0) { String watermark = arr[0].newCursor().getTextValue(); System.out.println(watermark); } } catch (XmlException | IOException ex) { ex.printStackTrace(); } } }
修改完成后运行即可正常输出CONFIDENTIAL。
内容的提问来源于stack exchange,提问作者Sahib Yar
相关产品推荐
相关产品推荐

