Как изменить корневой элемент - PullRequest
0 голосов
/ 13 июня 2018

Я использую библиотеку JAXB, чтобы превратить объект Java в файл XML.Теперь я получаю вывод:

<company>
     <name>Amazon</name>
</company>

Что я хочу получить:

<companies>
      <company>
         <name>Amazon</name>
    </company>
</companies>

Как мне достичь своей цели?Нужно ли удалять @XmlRootElement из Java-объекта (и, конечно, делать что-то еще)?

@XmlRootElement
public class Company {  
    private String name;

    public String getName() {
        return name;
    }

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

Или мне следует редактировать класс, использующий методы Marshaller?

public String marshall(BasicModel basicModel){      
            JAXBContext jaxbContext = JAXBContext.newInstance(basicModel.getClass());
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            StringWriter writer = new StringWriter();       
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);     

            jaxbMarshaller.marshal(basicModel, writer);             

            return writer.toString();   
    }

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Просто оберните его:

import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;

public class Test {
    @XmlRootElement
    public static class Companies {
        private Company[] company;

        public Companies(){}
        public Companies(Company[] company){this.company = company;}

        public Company[] getCompany() {
            return company;
        }

        public void setCompany(Company[] company) {
            this.company = company;
        }
    }

    @XmlRootElement
    public static class Company {  
        private String name;

        public Company(){}
        public Company(String name){this.name = name;}

        public String getName() {
            return name;
        }

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

    public static String marshall(Object basicModel) throws JAXBException{      
        JAXBContext jaxbContext = JAXBContext.newInstance(basicModel.getClass());
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        StringWriter writer = new StringWriter();       
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);     

        jaxbMarshaller.marshal(basicModel, writer);             

        return writer.toString();   
    }

    public static void main(String[] args) throws JAXBException {
        Company comp1 = new Company("test");
        System.out.println(marshall(comp1));
        Companies c = new Companies();
        Company[] compArr = new Company[1];
        compArr[0] = comp1;
        c.setCompany(compArr);
        System.out.println(marshall(c));
    }
}

Это приведет к следующему выводу:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<company>
    <name>test</name>
</company>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<companies>
    <company>
        <name>test</name>
    </company>
</companies>

(Я использовал массив, потому что я предполагаю, что вы хотели бы сохранить список компаний.)

0 голосов
/ 23 июня 2018

SimpleXml может сделать это:

final String data = ...
final SimpleXml simple = new SimpleXml();
final Element element = element("companies").child(simple.fromXml(data));
System.out.println(simple.domToXml(element));

Будет выводить;

<companies><company><name>Amazon</name></company></companies>

Из центрального центра Maven:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>
0 голосов
/ 13 июня 2018

Вы можете создать класс-оболочку и сериализовать его, он будет работать независимо от того, является ли Company также @XmlRootElement:

@XmlRootElement(name = "companies")
@XmlAccessorType(XmlAccessType.FIELD)
public class Companies {  

    @XmlElement(name = "company")
    List<Company> companies = new ArrayList<Company>();

    // getters , setters...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...