缺少JAXB名称空间前缀

Art*_*r . 30 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>
Run Code Online (Sandbox Code Playgroud)

但是我需要

<?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>
    . . .
Run Code Online (Sandbox Code Playgroud)

我怎样才能从Java控制它?

非常感谢

bdo*_*han 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.*;
Run Code Online (Sandbox Code Playgroud)

  • 没有测试过,但这会很好。不幸的是,java文件是生成的,所以你需要构建过程来将此自定义文件放置在与生成的文件相同的位置... (2认同)

Hea*_*hen 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
)
Run Code Online (Sandbox Code Playgroud)

在package-info.java文件中使用.

@XmlType(namespace="http://www.example.org/type")
Run Code Online (Sandbox Code Playgroud)

用于类声明

@XmlElement(namespace="http://www.example.org/property")
Run Code Online (Sandbox Code Playgroud)

用于财产.

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


Ser*_*nov 2

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