嗨,我的项目需求之一是手动创建一个PMML。直到4.2版本,它是好的,现在我试着做同样的使用4.4版本,但它给了我以下错误。
由: javax.xml.bind.UnmarshalException:意外元素(uri:"",local:"PMML")引起。预期元素是{https://www.dmg.org/PMML-4\_4}AR.
这是我的示例代码
String pmmlString="<?xml version=\"1.0\" encoding=\"UTF-8\"?><PMML xmlns=\"http://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();
xif.setProperty(XMLInputFactory.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) {
}
}
}Im遵循与https://dmg.org/pmml/v4-4/GeneralStructure.html中提到的完全相同的结构
发布于 2022-09-22 13:28:45
当我将xsd转换为java时,jaxb创建了包-info.java,如下所示:@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.dmg.org/PMML-4_4", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.fico.carbon.pmml;
一旦删除了上面的注释,它就开始工作了。
发布于 2022-10-11 13:13:22
简而言之,PMML字符串引用http://www.dmg.org/PMML-4_4 XML命名空间URI (HTTP协议),而PMML文件引用https://www.dmg.org/PMML-4_4 one (HTTPS协议)。这两个XML名称空间URI是不同的,因此您的解析器正确地认为PMML字符串不符合PMML。
DMG.org似乎把他们的网站从HTTP迁移到HTTPS,有时是在2022年初夏。他们一定是通过在所有站点内容上执行强制字符串替换(包括附件文件(如PMML文件)来做到这一点的。
显然,这个字符串替换执行得不正确,因为更改这样的XML命名空间URI前缀是不正确的。该bug已被DMG.org报告为第274期,但没有任何反应/反馈。
TLDR: PMML字符串是正确的。您需要手动编辑新下载的PMML文件,并将PMML命名空间URI从HTTPS更改为HTTP。然后它就会起作用(就像它工作了很多年一样)。
https://stackoverflow.com/questions/73796608
复制相似问题