使用ph-schematron-pure 7.1.0验证Peppol XML时触发空指针异常排查
关于ph-schematron-pure校验Peppol XML时的NullPointerException问题
我使用依赖com.helger.schematron:ph-schematron-pure:7.1.0,尝试基于Schematron规则文件CEN-EN16931-UBL.sch校验Peppol XML文件。
以下是校验代码:
final var res = SchematronResourcePure.fromFile(new File("CEN-EN16931-UBL.sch")); //if (!res.isValidSchematron()) // throw new IllegalArgumentException("Invalid Schematron!"); res.setErrorHandler(new IPSErrorHandler() { @Override public void handleError(@Nonnull final IError aError) { System.out.println(aError.toString()); } }); final SchematronOutputType schematronOutputType = res.applySchematronValidationToSVRL(new StreamSource(new StringReader(xml))); SVRLHelper.getAllFailedAssertions(schematronOutputType);
执行时抛出NullPointerException,报错信息如下:
15:17:00.219 [main] DEBUG com.helger.commons.lang.ServiceLoaderHelper - Finished retrieving all 1 SPI implementations of interface com.helger.commons.hashcode.IHashCodeImplementationRegistrarSPI 15:17:00.235 [main] DEBUG com.helger.commons.hashcode.HashCodeImplementationRegistry - Reinitialized com.helger.commons.hashcode.HashCodeImplementationRegistry 15:17:00.793 [main] DEBUG com.helger.schematron.pure.preprocess.PSPreprocessor - Schematron does not need any preprocessing. Returning Schema as-is. 15:17:00.805 [main] DEBUG com.helger.schematron.pure.bound.xpath.PSXPathBoundSchema - Binding pure Schematron Exception in thread "main" java.lang.NullPointerException: Cannot invoke "net.sf.saxon.value.AtomicValue.equals(Object)" because "a" is null at net.sf.saxon.expr.sort.GenericAtomicComparer.lambda$makeAtomicComparisonFunction$6(GenericAtomicComparer.java:248) at net.sf.saxon.expr.ValueComparison$ValueComparisonElaborator.lambda$elaborateForBoolean$4(ValueComparison.java:620) at net.sf.saxon.expr.FilterExpression$FilterExprElaborator$SimpleFilteredIterator.next(FilterExpression.java:1391) at net.sf.saxon.om.SequenceTool.supply(SequenceTool.java:145) at net.sf.saxon.expr.sort.DocumentOrderIterator.<init>(DocumentOrderIterator.java:41) at net.sf.saxon.expr.sort.DocumentSorter$DocumentSorterElaborator.lambda$elaborateForPull$0(DocumentSorter.java:331) at net.sf.saxon.functions.Count$CountFnElaborator.lambda$elaborateForItem$0(Count.java:135) at net.sf.saxon.expr.ValueComparison$ValueComparisonElaborator.lambda$elaborateForBoolean$4(ValueComparison.java:620) at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:181) at com.helger.schematron.pure.xpath.XPathEvaluationHelper.evaluate(XPathEvaluationHelper.java:63) at com.helger.schematron.pure.xpath.XPathEvaluationHelper.evaluateAsBoolean(XPathEvaluationHelper.java:70) at com.helger.schematron.pure.bound.xpath.PSXPathBoundSchema._validateSerial(PSXPathBoundSchema.java:739) at com.helger.schematron.pure.bound.xpath.PSXPathBoundSchema.validate(PSXPathBoundSchema.java:807) at com.helger.schematron.pure.bound.AbstractPSBoundSchema.validateComplete(AbstractPSBoundSchema.java:259) at com.helger.schematron.pure.SchematronResourcePure.applySchematronValidationToSVRL(SchematronResourcePure.java:394) at com.helger.schematron.AbstractSchematronResource.applySchematronValidationToSVRL(AbstractSchematronResource.java:286)
空指针的可能原因
从报错栈可以看出,空指针是在Saxon执行原子值比较时触发的,核心原因是某个待比较的原子值为null,常见场景包括:
- 待校验的XML文件中,存在Schematron规则要求必须存在的节点/属性,但实际缺失,导致XPath查询返回空值,后续比较逻辑触发NPE
- Schematron规则文件
CEN-EN16931-UBL.sch中的XPath表达式存在逻辑缺陷,比如直接对可能为空的节点值做等值比较,未添加空值判断逻辑 - XML文件中部分节点的文本值为空,而规则中的XPath未处理这种空值场景
排查建议
- 取消注释代码中
res.isValidSchematron()的校验逻辑,先确认Schematron规则文件本身是合法有效的,避免规则文件问题导致后续执行异常 - 检查待校验的XML文件,确认是否存在规则中要求的必填节点/属性缺失的情况
- 查看
CEN-EN16931-UBL.sch中对应的XPath规则,定位触发比较的逻辑,确认是否未处理空值情况
内容的提问来源于stack exchange,提问作者viglu
相关产品推荐
相关产品推荐

