2011-06-09 166 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時,你應該明白你正在進行一場艱苦的戰鬥。