缺少JAXB名称空间前缀

时间:2011-06-09 14:05:29

标签: java jaxb

我已经从XSD生成了Java类,从解组的角度来看,一切正常。

然而,当我从JAXB课程编组时,我得到以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://poc.cmc.com/ScreenLayout">
    <Data>
        <Type>Sample</Type>
     . . .
</message>

但我需要

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns0:message xmlns:ns0="http://poc.cmc.com/ScreenLayout">
    <ns0:Data>
        <ns0:Type>Sample</ns0:Type>
    . . .

如何从Java控制它?

非常感谢

4 个答案:

答案 0 :(得分:34)

您可以在@XmlSchema类上使用package-info注释为命名空间指定前缀:

@XmlSchema(
    namespace = "http://poc.cmc.com/ScreenLayout",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(prefix="ns0", namespaceURI="http://poc.cmc.com/ScreenLayout")})    
package your.package;


import javax.xml.bind.annotation.*;

答案 1 :(得分:8)

不能发布此评论作为评论!

  

因为消费应用程序非常愚蠢而且需要前缀

在这种情况下,哑应用程序并不真正消耗xml。查看此链接http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html并使用命名空间选项。具体地

@XmlSchema (
   xmlns = {
         @javax.xml.bind.annotation.XmlNs(prefix = "ns1", namespaceURI="http:test"),
         @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI="http:www.w3.org2001XMLSchema")
   },
   namespace = "http:test",
   elementFormDefault = XmlNsForm.UNQUALIFIED,
   attributeFormDefault = XmlNsForm.UNSET
)

用于package-info.java文件。

@XmlType(namespace="http://www.example.org/type")

用于类声明

@XmlElement(namespace="http://www.example.org/property")

在物业上使用。

某些组合或这些选项中只有一个可以为您提供所需的内容。但是,当您从有效的xml移动到必须在所有元素上包含特定名称空间前缀的xml时,您应该理解您正在进行一场艰苦的战斗。

答案 2 :(得分:2)

根据XML规范,两个xml都是相同的,因为xmlns =“”定义了适用于当前和所有子元素的默认命名空间。 在两种情况下,XML解析器都应该为您提供相同的DOM或SAX

答案 3 :(得分:1)

我执行了以下步骤,一切正常。基本上,我已经从 wsdl 或您拥有的任何架构文件中进行了编译。

  1. 下载自 https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/(我使用的是 2.3.4 版)
  2. 使用以下命令:
xjc.sh -wsdl -npa -mark-generated -d src/main/java -p your.package.hierarchy src/main/resources/wsdl/*

我有 wsdl 文件,这就是第一个标志的原因,-npa 是在注释中而不是在 package-info.java 中添加命名空间信息,因为由于某种原因这对我不起作用。< /p>