JAXB добавляет пространство имен к родительскому, но не к дочерним элементам, содержащимся - PullRequest
5 голосов
/ 31 мая 2010

Я собрал XSD и использовал JAXB для генерации из него классов.

Вот мои XSD-

myDoc.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.mydoc.org"
       targetNamespace="http://www.mydoc.org"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:mtp="http://www.mytypes.com" elementFormDefault="qualified">

<xs:import namespace="http://www.mytypes.com" schemaLocation="mytypes.xsd" />
<xs:element name="myDoc">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="crap" type="xs:string"/>
      <xs:element ref="mtp:foo"/>
      <xs:element ref="mtp:bar"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

mytypes.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.mytypes.com"
       xmlns="http://www.mytypes.com"
       xmlns:tns="http://www.mytypes.com"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       attributeFormDefault="qualified" elementFormDefault="qualified">


  <xs:element name="foo" type="tns:Foo"/>
  <xs:element name="bar" type="tns:Bar"/>
  <xs:element name="spam" type="tns:Spam"/>

  <xs:simpleType name="Foo">
    <xs:restriction base="xs:string"></xs:restriction>
  </xs:simpleType>

  <xs:complexType name="Bar">
    <xs:sequence>
      <xs:element ref="spam"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="Spam">
    <xs:restriction base="xs:string" />
  </xs:simpleType>

</xs:schema>

Документ составлен -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
  <crap>real crap</crap>
  <ns2:foo>bleh</ns2:foo>
  <ns2:bar>
    <spam>blah</spam>
  </ns2:bar>
</myDoc>

Обратите внимание, что элемент <spam> использует пространство имен по умолчанию. Я хотел бы использовать пространство имен ns2. Схема (mytypes.xsd) выражает тот факт, что <spam> содержится в <bar>, который в экземпляре XML связан с пространством имен ns2.

Я ломал голову над этим более недели, и я хотел бы, чтобы префикс ns2 появился в <spam>. Что мне делать?

Обязательно:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
  <crap>real crap</crap>
  <ns2:foo>bleh</ns2:foo>
  <ns2:bar>
    <ns2:spam>blah</ns2:spam><!--NS NS NS-->
  </ns2:bar>
</myDoc>

Ответы [ 6 ]

2 голосов
/ 16 февраля 2011

проверяет, не пропущены ли поля в сгенерированных классах аннотации @XmlElement, и если они присутствуют, им не хватает атрибута пространства имен. Эти два элемента необходимы для того, чтобы получить префикс пространства имен для каждого элемента в вашем маршалированном xml

0 голосов
/ 30 мая 2016

Вы можете указать это в вашем package-info.java в аннотации @XmlSchema.

elementFormDefault=XmlNsForm.QUALIFIED

пример пакета-info.java

@XmlSchema(
    namespace="desiredNamespace",   
    // If qualified namespace will be added to all elements
    elementFormDefault = XmlNsForm.QUALIFIED,
    // If qualifies namespace will be added to all attributes
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = {   
        @XmlNs(prefix = "xsd", namespaceURI = "desiredNamespace"),
        @XmlNs(prefix = "xsi", namespaceURI = "anotherLink"),
    }
)
0 голосов
/ 29 октября 2010

Проверяли ли вы свой код, что вы указали свой ElementType как " Спам ", но в строке обозначены как "спам". эта заглавная " S " и маленькая " s " в вашем коде, если не беспокоит, извините, но если это действительно беспокоит, возможно, вам придется использовать его правильно Попробуйте использовать "Спам" везде и проверить это на ..

- Извините, я новичок в XSLT, XML, XSD и прочее и не знаю о JAXB. но в целом, когда мы читаем о написании XML-документов с использованием Xsd, мы всегда заботимся о чувствительности к регистру.

извините, если этот ответ не решит вашу проблему.

0 голосов
/ 23 августа 2010

Эта ошибка также возникает при сборке с Maven 2 и следующим jaxws-maven-plugin.

 <groupId>org.codehaus.mojo</groupId>
 <artifactId>jaxws-maven-plugin</artifactId>

И по какой-то причине настроил плагин maven-compiler-plugin для Java 1.5. Установка цели / источника на 1.6 устраняет проблему.

 <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        </configuration>
 </plugin>

Если вы знаете, почему, пожалуйста, не стесняйтесь комментировать.

0 голосов
/ 03 июня 2010

package-info.java не был скомпилирован моей системой сборки, поэтому elementFormDefault = "qualised" и целевое пространство имен не попало в аннотированные классы Jaxb.

Если вы видите такое поведение, убедитесь, что ваш package-info.java компилируется в файл .class и находится в вашем пути к классам.

Приветствие.

0 голосов
/ 31 мая 2010

Я попытался воспроизвести вашу проблему, но здесь она работает правильно: при маршалинге спам-элемент получает пространство имен ns2.

Мой код сортировки:

    Bar bar = new Bar();
    bar.setSpam("s");

    MyDoc myDoc = new MyDoc();
    myDoc.setBar(bar);

    JAXBContext context = JAXBContext.newInstance("org.mydoc");

    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(myDoc, System.out);

Выход:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myDoc xmlns="http://www.mydoc.org" xmlns:ns2="http://www.mytypes.com"><ns2:bar><ns2:spam>s</ns2:spam></ns2:bar></myDoc>

Моя версия JAXB:

xjc version "JAXB 2.1.3 in JDK 1.6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build IBM JAXB 2.1.3 in JDK 1.6)

EDIT:

Класс Bar.java имеет следующую аннотацию:

@XmlElement(required = true)
protected String spam;

XmlElement также имеет атрибут пространства имен. Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()

По умолчанию он просматривает аннотацию @XmlSchema в пакете com.mytypes. Вы удалили аннотацию @XmlSchema и / или файл package-info.java?

...