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

手动创建PMML 4.4时遇JAXB UnmarshalException异常求助

问题解决:PMML 4.4 JAXB解组异常

异常根源

你的代码存在两个核心问题:

  • 命名空间感知被关闭:设置XMLInputFactory.IS_NAMESPACE_AWARE为false,导致XML解析器忽略XML中的命名空间信息,JAXB无法匹配到对应版本的PMML绑定类。
  • 命名空间URI不匹配:XML中声明的命名空间是http://www.dmg.org/PMML-4_4,但PMML 4.4的JAXB绑定类实际关联的是https://www.dmg.org/PMML-4_4(从异常信息里的{https://www.dmg.org/PMML-4_4}AR可验证),HTTP与HTTPS的差异导致类绑定失败。

修正方案

1. 开启命名空间感知

直接移除xif.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);这行代码(XMLInputFactory默认就是命名空间感知的),或者显式设置为true。

2. 修正XML中的命名空间URI

将XML里的xmlns="http://www.dmg.org/PMML-4_4"改为xmlns="https://www.dmg.org/PMML-4_4"。

修正后的完整代码

String pmmlString="<?xml version=\"1.0\" encoding=\"UTF-8\"?><PMML xmlns=\"https://www.dmg.org/PMML-4_4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"4.4\"></PMML>";
PMML pmml = null;
XMLStreamReader xsr = null;
try {
    JAXBContext jc = JAXBContext.newInstance(PMML.class);
    Unmarshaller u = jc.createUnmarshaller();
    XMLInputFactory xif = XMLInputFactory.newInstance();
    // 移除IS_NAMESPACE_AWARE=false的设置,保持默认的命名空间感知
    xif.setProperty(XMLInputFactory.IS_COALESCING, false);
    xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
    xsr = xif.createXMLStreamReader(new ByteArrayInputStream(pmmlString.getBytes()));

    pmml = (PMML) u.unmarshal(xsr);

} catch(Exception e){
    e.printStackTrace();
} finally {
    if (xsr != null) {
        try {
            xsr.close();
        } catch (Exception e) {
            // 忽略关闭异常
        }
    }
}

补充说明

PMML 4.4版本的命名空间协议头从HTTP升级为HTTPS,这是版本迭代后的变更点,必须严格匹配URI才能让JAXB完成正确的类绑定。

内容的提问来源于stack exchange,提问作者Abhishek B A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:40:45