You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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未处理这种空值场景

排查建议

  1. 取消注释代码中res.isValidSchematron()的校验逻辑,先确认Schematron规则文件本身是合法有效的,避免规则文件问题导致后续执行异常
  2. 检查待校验的XML文件,确认是否存在规则中要求的必填节点/属性缺失的情况
  3. 查看CEN-EN16931-UBL.sch中对应的XPath规则,定位触发比较的逻辑,确认是否未处理空值情况

内容的提问来源于stack exchange,提问作者viglu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:48:23