1

これはNo @XmlRootElement generated by JAXBのような質問とは逆の方向です。基本的に、schemagen を実行し、同じタイプの 2 つのグローバル要素を持ちたいと考えています。

<xs:element name="root1" type="tns:sameType"/>
<xs:element name="root2" type="tns:sameType"/>

JAXBElement を使用してマーシャリングする方法は理解していますが、スキーマを正しく生成する方法がわかりません。私の考えでは、次のスニペットのようになります (@XmlRootElements は架空のものです)。

@XmlRootElements(value = {
    @XmlRootElement(name="root1", namespace="urn:example"),
    @XmlRootElement(name="root2", namespace="urn:example")
})
4

1 に答える 1

3

@XmlElementDeclで注釈が付けられたクラスで注釈を使用できます@XmlRegistry

ObjectFactory

@XmlElementDecl注釈は、型に対応する複数のグローバル要素がある場合に使用されます。create注釈は、 で注釈されたクラスのメソッドに配置されます@XmlRegistry。モデルが XML スキーマから生成されるとき、このクラスは常に呼び出されObjectFactoryます。

package forum14845035;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="root1")
    public JAXBElement<SameType> createRoot1(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root1"), SameType.class, sameType);
    }

    @XmlElementDecl(name="root2")
    public JAXBElement<SameType> createRoot2(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root2"), SameType.class, sameType);
    }

}

同じタイプ

この使用例では、ドメイン クラスに注釈は必要ありません。

package forum14845035;

public class SameType {

}

パッケージ情報

パッケージ レベルの@XmlSchema注釈を利用して、モデルの名前空間修飾を指定します。

@XmlSchema(namespace="urn:example", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14845035;

import javax.xml.bind.annotation.*;

デモ

package forum14845035;

import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(SameType.class, ObjectFactory.class);
        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }

        });
    }

}

出力

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

  <xs:element name="root1" type="tns:sameType"/>

  <xs:element name="root2" type="tns:sameType"/>

  <xs:complexType name="sameType">
    <xs:sequence/>
  </xs:complexType>

</xs:schema>

詳細については

于 2013-02-13T01:38:05.407 に答える