12

したがって、次の形式の XSD タイプがあります。

<xs:complexType name="Foo">
    <xs:all>
        <xs:element name="Bars">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="Bar" type="barType" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:all>
</xs:complexType>    

XML を表すには:

<Foo>
    <!-- Elements snipped for brevity-->
    <Bars>
        <Bar>
            <!-- Bar Element -->
        </Bar>
    </Bars>
</Foo>

xjc はほぼ正しい結果を生成します。唯一厄介なのは、「Bars」が Bars のリストを格納する内部クラスとして作成されることです。上記のXMLを保持しながら、バーをFooのリストにする方法はありますか?

4

5 に答える 5

6

Bars を複合型として定義すると、Bars は別のクラスとして生成されます。このように、スキーマも読みやすいと思います。maxOccurs を 1 より大きい値に変更しない限り、バーは Foo の List にはなりません。xs:all ではこれを行うことはできませんが、xs:sequence を使用することはできます。

...
    <xs:complexType name="Foo">
        <xs:all>
            <xs:element name="Bars" type="Bars" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="Bars">
        <xs:sequence>
            <xs:element name="Bar" type="barType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
...

xjc: Foo.java を実行した後:

    ...
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Foo", propOrder = {

    })
    public class Foo {

        @XmlElement(name = "Bars", required = true)
        protected Bars bars;

        public Bars getBars() {
            return bars;
        }

        public void setBars(Bars value) {
            this.bars = value;
        }
    }

Bars.java:

    ...
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Bars", propOrder = {
        "bar"
    })
    public class Bars {

        @XmlElement(name = "Bar", required = true)
        protected List<String> bar;

        ...
    }

xs:seqence を使用してバーのリストを取得します (maxOccurs="unbounded"): XSD:

    ...
    <xs:complexType name="Foo">
        <xs:sequence>
            <xs:element name="Bars" type="Bars" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Bars">
        <xs:sequence>
            <xs:element name="Bar" type="barType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    ...

Foo.java:

...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
    "bars"
})
public class Foo {

    @XmlElement(name = "Bars", required = true)
    protected List<Bars> bars;

    public List<Bars> getBars() {
        if (bars == null) {
            bars = new ArrayList<Bars>();
        }
        return this.bars;
    }
}
于 2011-02-08T21:25:30.630 に答える
4

Bjarne Hansen の xjc 用プラグイン ( https://github.com/dmak/jaxb-xew-plugin ) を使用すると、要素を囲む "Bars" を使用して、便利な @XmlElementWrapper(name="Bars") アノテーションを生成できます。

于 2011-02-26T07:04:22.063 に答える
2

次のことができます。

package example;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Foo")
public class Foo {

    private List<Bar> bar;

    public List<Bar> getBar() {
        return bar;
    }

    @XmlElementWrapper(name="Bars")
    @XmlElement(name="Bar")
    public void setBar(List<Bar> bar) {
        this.bar = bar;
    }

}

package example;

public class Bar {

}

次に、次のコードを使用して XML を処理できます。

package example;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Foo foo = (Foo) unmarshaller.unmarshal(new File("src/forum128/input.xml"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }
}
于 2011-02-01T14:33:01.770 に答える
2

もう 1 つの方法は、周囲の <bars> 要素を削除することです。XML は見栄えが悪くなりますが、Java コードが読みやすくなります。xjc の単純なバインディング ( http://jaxb.java.net/nonav/jaxb20-fcs/docs/vendorCustomizations.htmlを参照) と一緒に使用すると、かなりきれいで便利な Java コードが生成されます。

于 2011-02-01T15:05:42.387 に答える
2

以下のサンプルが役立つかもしれません。

XML スキーマ

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

      <xs:complexType name="test">
        <xs:sequence>
          <xs:element name="dataList" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="str" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>

Java クラス :

public class Test {

    protected List<String> dataList;
    protected String str;
    public List<String> getDataList() {
        if (dataList == null) {
            dataList = new ArrayList<String>();
        }
        return this.dataList;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String value) {
        this.str = value;
    }

}

編集1:

Java コードから xsd にリバース エンジニアリングできます。JAVA_HOME/bin に schemagen 実行可能ファイルがあります。

Java コードを指定すると、Java クラスを使用して XSD スキーマが作成されます。

このリンクを参照してください

schemagen myObj1.java myObj2.java
于 2011-02-01T15:09:33.810 に答える