2012-01-08 21 views
2

こんにちは、私はJAXBで使用したいのでxsdについて学習し始めました。JAXB用に変更可能なxmlファイルのXSDスキーマ

私は同じ要素で始まったXMLタグを持っている可能性がありますが、毎回まったく異なる子要素を持つ可能性があります。ここで

は、例1である:

<service>Hotel 
     <request>location 
      <currentLongitude>100</currentLongitude> 
      <currentLatitude>100</currentLatitude> 
     </request> 
    </service> 

例2:私は、 "要求が" 完全に異なる要素

た場合、またはを持つことができるよう求められていることをXSDでこれを書くのですか。基本的

<service>Hotel 
     <request>Price 
      <Single>130</Single> 
      <Double>140</Double> 
     </request> 
    </service> 

それは私がこのxmlをJAXBで処理するより良い方法ですか? XSDの

おかげ

答えて

1

あなたはとしてあなたrequest要素を定義することができます。

@XmlMixed 
@XmlAnyElement(lax = true) 
protected List<Object> content; 

FULL例:これは、JAXBは以下のように注釈されているフィールド/プロパティを生成します

<xsd:element name="request"> 
    <xsd:complexType mixed="true"> 
     <xsd:sequence> 
      <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

any.xsd

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

    <xsd:element name="service"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="request"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="request"> 
     <xsd:complexType mixed="true"> 
      <xsd:sequence> 
       <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

XJCコール

xjc -d out -p forum8776746 any.xsd 

サービス

package forum8776746; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "request" 
}) 
@XmlRootElement(name = "service") 
public class Service { 

    @XmlElement(required = true) 
    protected Request request; 

    public Request getRequest() { 
     return request; 
    } 

    public void setRequest(Request value) { 
     this.request = value; 
    } 

} 

リクエスト

package forum8776746; 

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlMixed; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "request") 
public class Request { 

    @XmlMixed 
    @XmlAnyElement(lax = true) 
    protected List<Object> content; 

    public List<Object> getContent() { 
     if (content == null) { 
      content = new ArrayList<Object>(); 
     } 
     return this.content; 
    } 

} 
0

全体のポイントは、アプリケーションによって処理することが容易になるように、XMLメッセージを制約することです。私はあなたがそれぞれのタイプのリクエストに対して別々の要素を持つようにアプローチを考え直すことをお勧めします。例えば、

<service> 
     <hotel-location-request> 
      <currentLongitude>100</currentLongitude> 
      <currentLatitude>100</currentLatitude> 
     </hotel-location-request> 
</service> 

<service>Hotel 
     <hotel-price-request> 
      <Single>130</Single> 
      <Double>140</Double> 
     </hotel-price-request> 
</service> 
関連する問題