Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB解组不允许令牌枚举周围出现空格_Java_Xml_Jaxb_Xsd_Jaxb2 - Fatal编程技术网

Java JAXB解组不允许令牌枚举周围出现空格

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运行以下代码时,以及您问题中的文档,我得

Oracle/Metro 2.2.7版和我怀疑其他人似乎也不允许枚举元素中的值周围出现空格

下面是最简单的例子。并根据模式验证实例。令人费解的是,JAXB验证并不抱怨,而是在尝试访问值时返回null。如何将其配置为正确返回值

更新:我已经尝试按照建议关联XmlAdapter来修剪字符串,但结果是一样的

更新二:这里是

A.xsd a、 xml 注意“Organization”后面的空格

解组码
当我使用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>