Маршаллинг XML: Как добавить атрибут из другого пространства имен к элементу - PullRequest
3 голосов
/ 24 августа 2010

Я хочу сгенерировать этот XML:

<myElement myAttribute="whateverstring" xsi:type="hardPart"/>

У меня есть этот XSD:

<xsd:element name="myElement">
    <xsd:complexType>
        <xsd:attribute name="myAttribute" type="xsd:boolean" />
        <!-- need to add the xsi:attribue here -->
    </xsd:complexType>
</xsd:element>

Как именно я могу выполнить это в моем XSD (к вашему сведению: я использую его длямаршалловые объекты в XML в Java, используя JiBX).

1 Ответ

1 голос
/ 24 августа 2010

Если вы говорите xsi: type, вы имеете в виду атрибут "type" из пространства имен "http://www.w3.org/2001/XMLSchema-instance"". Это не то, что вы добавляете в свою XML-схему, это зарезервированное средство квалификации элемента (похоже на приведение в Java).

Для того, чтобы следующее было действительным:

<myElement myAttribute="whateverstring" xsi:type="hardPart"/> 

Вам потребуется схема XML, например:

<xsd:element name="myElement" type="myElementType"/>  
<xsd:complexType name="myElementType">  
    <xsd:attribute name="myAttribute" type="xsd:boolean" />  
</xsd:complexType>  
<xsd:complexType name="hardPart">
    <xsd:complexContent>
        <xsd:extension base="myElementType">
            ...
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

Тогда, когда ваше решение для связывания XML маршализирует объект, соответствующий типу "hardPart", оно может представлять его как:

<myElement myAttribute="whateverstring" xsi:type="hardPart"/> 

Поскольку myElement соответствует супертипу "myElementType" и должен быть квалифицирован с помощью xsi: type = "hardPart", чтобы указать, что содержимое действительно соответствует подтипу "hardPart".

Пример JAXB

MyElementType

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MyElementType {

    private String myAttribute;

    @XmlAttribute
    public void setMyAttribute(String myAttribute) {
        this.myAttribute = myAttribute;
    }

    public String getMyAttribute() {
        return myAttribute;
    }

}

HardPart

public class HardPart extends MyElementType {

}

Демо

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;

public class Demo {

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

        HardPart hardPart = new HardPart();
        hardPart.setMyAttribute("whateverstring");
        JAXBElement<MyElementType> jaxbElement = new JAXBElement(new QName("myElement"), MyElementType.class, hardPart);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(jaxbElement, System.out);
    }
}
...