【问题标题】:JAXB marshalling omitting prefixJAXB 编组省略前缀
【发布时间】:2014-06-13 18:35:44
【问题描述】:

我有一个用于将 Java 对象编组为 XML 的 JAXB 配置。它完成了这项工作,但是,它省略了命名空间前缀并将<?xml version="1.0" encoding="UTF-8" standalone="yes"? 附加到编组字符串的前面。

    <beans:bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"  p:contextPath="org.ncpdp.schema.script">
         <beans:property name="schema" value="classpath:/schema/SCRIPT_XML_10_6_OPPR.xsd"/>
         <beans:property name="marshallerProperties">
            <beans:map>
                <beans:entry key="jaxb.formatted.output"><beans:value type="boolean">true</beans:value></beans:entry>
                 <beans:entry key="com.sun.xml.internal.bind.namespacePrefixMapper" value-ref="namespaceMapper"></beans:entry>

            </beans:map>
         </beans:proper

ty>
    </beans:bean>

</beans:bean>

public class NamespaceMapper extends NamespacePrefixMapper implements ListenerConstants{

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion,
            boolean requirePrefix) {
         if(NAME_SPACE_SCHEMA_URL.equals(namespaceUri)) {
                return NS_PREFIX_SCR;
            } else if(KPRX_NAME_SPACE_URL.equals(namespaceUri)) {
                return NS_PREFIX_V5;
            }
            return suggestion;
    }

}

 public String marshal(final Object object) throws JAXBException {
        final StringWriter writer = new StringWriter();
        final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class );
        final Marshaller unmarshaller = jaxbContext.createMarshaller();
        unmarshaller.marshal(object, new StreamResult(writer));

        return writer.toString();
    }

我想要一条带有类似前缀的消息

<NS2:TEST>
<NS2:ID>123</NS2:ID>
</NS2:TEST>

没有这个声明&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?

【问题讨论】:

    标签: xml spring jaxb


    【解决方案1】:

    您可以尝试使用以下内容修改您的标题:

    unmarshaller.setProperty("com.sun.xml.bind.xmlHeaders", "");
    unmarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    

    命名空间映射可能没有发生,因为您没有告诉编组器您的新实现。

    在编组之前,将命名空间前缀属性设置为新的类对象。

    unmarshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new NamespaceMapper());
    

    您可能必须删除 final 修饰符才能修改对象,但我不是 100%

    顺便说一句,您将编组器称为 unmarshaller 有点令人困惑,但这是您的代码...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2012-03-13
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多