Отсутствуют префиксы пространства имен JAXB - PullRequest
30 голосов
/ 09 июня 2011

Я сгенерировал Java-классы из XSD, все отлично работает с точки зрения недопустимости.

Однако, когда я маршаллю из классов 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?

Большое спасибо

Ответы [ 3 ]

34 голосов
/ 09 июня 2011

Вы можете использовать аннотацию @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.*;
8 голосов
/ 09 июня 2011

Не могу опубликовать это как комментарий!

потому что приложение-потребитель очень тупое и нуждается в префиксе

В этом случае глупое приложение на самом деле не потребляет 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 голосов
/ 09 июня 2011

Согласно спецификации XML оба XML одинаковы, так как xmlns = "" определяет пространство имен по умолчанию, которое применяется к текущим и всем дочерним элементам.Синтаксические анализаторы XML должны давать вам одинаковые DOM или SAX в обоих случаях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...