XSD-схема для XML-файла, которая может быть изменена для JAXB - PullRequest
2 голосов
/ 08 января 2012

Привет, я только начал изучать xsd, так как хочу использовать его с JAXB.

Мне было интересно, что у меня может быть тег XML, который начинается с одного и того же элемента, но каждый раз может иметь совершенно разные дочерние элементы.

Вот пример1:

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

example2:

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

В основном, как мне написать это в xsd, чтобы запрашиваемый "запрос" мог иметь совершенно разные элементы

Или, если это применимо, это лучший способ для меня обработать этот xml, чем JAXB?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 января 2012

Вы можете определить свой элемент request как:

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

Это заставит JAXB сгенерировать поле / свойство, которое будет аннотировано, например:

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

ПОЛНЫЙ ПРИМЕР

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 голосов
/ 09 января 2012

Весь смысл XSD состоит в том, чтобы ограничить сообщение 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>
...