JAXB подавляет XSI и xmlns - PullRequest
       0

JAXB подавляет XSI и xmlns

3 голосов
/ 23 сентября 2010

Я использую JAXB для маршалинга некоторых заводных объектов. Я получаю вывод, как это:

<desiredskillslist>
 <employeeDesiredSkills xsi:type="employeeDesiredSkill" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <name>C Development</name>
 </employeeDesiredSkills>
 <employeeDesiredSkills xsi:type="employeeDesiredSkill" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <name>Perl Development</name>
 </employeeDesiredSkills>
 <employeeDesiredSkills xsi:type="employeeDesiredSkill" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <name>Java Development</name>
 </employeeDesiredSkills>
 <employeeDesiredSkills xsi:type="employeeDesiredSkill" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <name>Database Design</name>
 </employeeDesiredSkills>
 <employeeDesiredSkills xsi:type="employeeDesiredSkill" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <name>Grails Development</name>
 </employeeDesiredSkills>

Я действительно не хочу, чтобы xsi:type= и xmlns:xsi= отображались в моем окончательном документе, так как он не нужен. Возможно ли это?

Также - я установил @XmlElementWrapper(name="desiredskillslist"), чтобы поместить теги вокруг employeeDesiredSkills, но если это вообще возможно, я бы предпочел просто не иметь тегов <employeeDesiredSkillsT> вообще - если это просто список имен это было бы здорово. Почему так получается, когда я аннотировал ArrayList?

1 Ответ

1 голос
/ 27 сентября 2010

Я действительно не хочу xsi: type = and xmlns: xsi = чтобы появиться в моем финале документ, так как это не нужно. Является это возможно?

Я не уверен, почему xsi: type появляется для вас. Как видно из приведенного ниже примера, он обычно не отображается. Какие типы вещей отличаются в вашей модели от приведенного ниже примера?

Я бы предпочел не иметь теги вообще - если это просто список имен, это было бы здорово.

Я считаю, что то, что вы ищете, может быть достигнуто с помощью аннотации @XmlValue. См. Свойство name в классе DesiredSkill ниже:

import java.util.*;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root {

    private List<DesiredSkill> employeeDesiredSkills = new ArrayList<DesiredSkill>();

    public List<DesiredSkill> getEmployeeDesiredSkills() {
        return employeeDesiredSkills;
    }

    public void setEmployeeDesiredSkills(List<DesiredSkill> employeeDesiredSkills) {
        this.employeeDesiredSkills = employeeDesiredSkills;
    }

}

и

import javax.xml.bind.annotation.XmlValue;

public class DesiredSkill {

    private String name;

    @XmlValue
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Тогда следующий код:

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

public class Demo {

    public static void main(String[] args) throws Exception {
        Root root = new Root();

        DesiredSkill cDev = new DesiredSkill();
        cDev.setName("C Development");
        root.getEmployeeDesiredSkills().add(cDev);

        DesiredSkill perlDev = new DesiredSkill();
        perlDev.setName("Perl Development");
        root.getEmployeeDesiredSkills().add(perlDev);

        JAXBContext jc = JAXBContext.newInstance(Root.class);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }
}

Будет производить:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <employeeDesiredSkills>C Development</employeeDesiredSkills>
    <employeeDesiredSkills>Perl Development</employeeDesiredSkills>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...