2011-06-09 137 views
27

我已经从XSD生成Java类,从解组的角度来看,所有工作都很好。缺少JAXB名称空间前缀

然而,当我从马歇尔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?

非常感谢

+2

第一个上市完全有效;它的默认名称空间设置为“http://poc.cmc.com/ScreenLayout”。为什么你需要一个命名空间前缀? – perp 2011-06-09 14:14:46

+4

嗨,因为消费应用程序是非常愚蠢的,需要前缀,我们无法控制它 – 2011-06-09 14:21:38

回答

2

根据XML规范对XML的是一样的,因为的xmlns =“”定义了适用于当前和所有子元素的默认命名空间。 XML解析器应该给你相同的DOM和SAX在这两种情况下

+0

好吧,解决与package-info.java: – 2011-06-09 14:42:24

+0

@ javax.xml.bind.annotation.XmlSchema(namespace =“http: //poc.cmc.com/ScreenLayout“, xmlns = {@XmlNs(namespaceURI =”http://poc.cmc.com/ScreenLayout“,prefix =”ns1“)}, elementFormDefault = XmlNsForm.QUALIFIED) – 2011-06-09 14:42:51

31

您可以使用@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

没有测试,但这会很好。不幸的是,生成的java文件,所以你需要你建立过程来把这个自定义文件放置在生成的文件相同的地方... – f1sh 2011-06-09 14:42:09

+0

我没有得到的是我的项目中有近20个包信息类。我需要添加哪一个@XmlNs信息? – hellzone 2013-10-30 15:46:53

+0

@hellzone - 以下链接可能有所帮助:http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html – 2013-10-30 15:53:30

4

广东话后这是一个发表评论!

因为消费应用是非常愚蠢的,需要前缀

在这种情况下,哑应用程序是不是真的消耗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时,你应该明白你正在进行一场艰苦的战斗。