Java JAXB解组不允许令牌枚举周围出现空格
Oracle/Metro 2.2.7版和我怀疑其他人似乎也不允许枚举元素中的值周围出现空格 下面是最简单的例子。并根据模式验证实例。令人费解的是,JAXB验证并不抱怨,而是在尝试访问值时返回null。如何将其配置为正确返回值 更新:我已经尝试按照建议关联XmlAdapter来修剪字符串,但结果是一样的 更新二:这里是 A.xsd a、 xml 注意“Organization”后面的空格 解组码Java JAXB解组不允许令牌枚举周围出现空格,java,xml,jaxb,xsd,jaxb2,Java,Xml,Jaxb,Xsd,Jaxb2,Oracle/Metro 2.2.7版和我怀疑其他人似乎也不允许枚举元素中的值周围出现空格 下面是最简单的例子。并根据模式验证实例。令人费解的是,JAXB验证并不抱怨,而是在尝试访问值时返回null。如何将其配置为正确返回值 更新:我已经尝试按照建议关联XmlAdapter来修剪字符串,但结果是一样的 更新二:这里是 A.xsd a、 xml 注意“Organization”后面的空格 解组码 当我使用JDK1.7.0_21-b12中的JAXB实现为Mac运行以下代码时,以及您问题中的文档,我得
当我使用JDK1.7.0_21-b12中的JAXB实现为Mac运行以下代码时,以及您问题中的文档,我得到了enum值作为输出
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
public class Demo {
public static void main(String args[]) throws Exception {
StreamSource xsd = new StreamSource("src/forum17114304/A.xsd");
StreamSource xml = new StreamSource("src/forum17114304/a.xml");
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(xsd);
schema.newValidator().validate(xml);
JAXBContext payloadContext = JAXBContext.newInstance("a");
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.setSchema(schema);
JAXBElement<?> oUnmarshalled = (JAXBElement<?>) unmarshaller
.unmarshal(xml);
Object o = oUnmarshalled.getValue(); // returns ORGANISATION
System.out.println(o);
}
}
更新
此用例中似乎存在一个bug:
此错误已在EclipseLink 2.5.1和2.6.0流中修复。从2013年6月15日起,可通过以下链接获得夜间下载:
当我使用JDK1.7.0_21-b12中的JAXB实现为Mac运行以下代码时,以及您问题中的文档,我得到了enum值作为输出
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
public class Demo {
public static void main(String args[]) throws Exception {
StreamSource xsd = new StreamSource("src/forum17114304/A.xsd");
StreamSource xml = new StreamSource("src/forum17114304/a.xml");
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(xsd);
schema.newValidator().validate(xml);
JAXBContext payloadContext = JAXBContext.newInstance("a");
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.setSchema(schema);
JAXBElement<?> oUnmarshalled = (JAXBElement<?>) unmarshaller
.unmarshal(xml);
Object o = oUnmarshalled.getValue(); // returns ORGANISATION
System.out.println(o);
}
}
更新
此用例中似乎存在一个bug:
此错误已在EclipseLink 2.5.1和2.6.0流中修复。从2013年6月15日起,可通过以下链接获得夜间下载:
由于目前我想坚持只将JAXB RI绘制到RI部分,因此最终我按照建议在XSLT 2.0转换中使用了replace.,“^\s+|\s+$”,“m” 相关代码部分为:
Source input = new StreamSource(new File("a.xml"));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer wsTrimmer = factory.newTransformer(new StreamSource(new File("transform-trim-all.xslt")));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wsTrimmer.transform(input, new StreamResult(bos));
JAXBElement<?> oUnmarshalled = (JAXBElement<?>) unmarshaller.unmarshal(new ByteArrayInputStream(bos.toByteArray()));
代码要求运行时路径上有Saxon HE,正如所使用的XSLT一样,我使用了以下ivy依赖项:
<dependency org="net.sf.saxon" name="Saxon-HE" rev="9.4"/>
XSLT是:
由于目前我想坚持只将JAXB RI绘制到RI部分,因此最终我按照建议在XSLT 2.0转换中使用了replace.,“^\s+|\s+$”,“m” 相关代码部分为:
Source input = new StreamSource(new File("a.xml"));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer wsTrimmer = factory.newTransformer(new StreamSource(new File("transform-trim-all.xslt")));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wsTrimmer.transform(input, new StreamResult(bos));
JAXBElement<?> oUnmarshalled = (JAXBElement<?>) unmarshaller.unmarshal(new ByteArrayInputStream(bos.toByteArray()));
代码要求运行时路径上有Saxon HE,正如所使用的XSLT一样,我使用了以下ivy依赖项:
<dependency org="net.sf.saxon" name="Saxon-HE" rev="9.4"/>
XSLT是:
我确认我得到了相同的空值:a来自Maven Repo的最新JAXB RI 2.2.7,b来自JAXB.java.net的相同,或者c Ubuntu 12.04上的JDK 1.7.0_21-b11。我将在Metro的JAXB JIRA上开一张罚单。@MarcusJuniusBrutus-在这个用例中,EclipseLink JAXB MOXy中也存在一个bug。我已经在EclipseLink 2.5.1和2.6.0流中修复了它。从明天开始,该补丁将在夜间下载中提供。如果您对尝试MOXy感兴趣,下面的链接将帮助您开始:我确认我得到了相同的空值:a来自Maven Repo的最新JAXB RI 2.2.7,b来自JAXB.java.net的相同,或c Ubuntu12.04上的JDK 1.7.0_21-b11。我将在Metro的JAXB JIRA上开一张罚单。@MarcusJuniusBrutus-在这个用例中,EclipseLink JAXB MOXy中也存在一个bug。我已经在EclipseLink 2.5.1和2.6.0流中修复了它。从明天开始,该补丁将在夜间下载中提供。如果您有兴趣尝试MOXy,以下链接将帮助您开始:
<dependency org="net.sf.saxon" name="Saxon-HE" rev="9.4"/>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:sequence select="replace(., '^\s+|\s+$', '', 'm')"/>
</xsl:template>
</xsl:stylesheet>