Я соединил XSD и использовал JAXB для генерации классов из него.
Вот мои XSDs-
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>
Я попытался воспроизвести вашу проблему, но здесь он работает правильно: при сортировке элемента спама возникает пространство имен 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)
РЕДАКТИРОВАТЬ:
Класс 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?
package-info.java не компилировался моей системой сборки, и поэтому elementFormDefault="qualified" и целевое пространство имен не попадали в аннотированные классы Jaxb.
Если вы видите такое поведение, убедитесь, что ваш package-info.java компилируется в файл .class и находится в вашем classpath.
Будьте здоровы.