JAXB и свойство List доступно по ключу - PullRequest
0 голосов
/ 21 января 2011

Используя JAXB, как я могу распаковать этот документ в объектную модель, которая позволит мне запрашивать имя пользователя по номеру мобильного телефона?

<Details>
    <Mobile>
        <Username>Rahul</Username>
        <MobileNumber>7539518520</MobileNumber>
    </Mobile>
    <Mobile>
        <Username>Rahul</Username>
        <MobileNumber>1234567890</MobileNumber>
    </Mobile>
    <Mobile>
        <Username>Kumar</Username>
        <MobileNumber>7894561230</MobileNumber>
    </Mobile>
</Details>

1 Ответ

1 голос
/ 21 января 2011

Для этого я бы использовал недешевое событие для хранения информации из списка мобильных объектов на карте.

Ваша модель домена будет выглядеть так:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

@XmlRootElement(name="Details")
@XmlAccessorType(XmlAccessType.NONE)
public class Details {

    private Map<String, String> mobileNumberToUsername;

    @XmlElement(name="Mobile")
    private List<Mobile> mobileList;

    public Details() {
        mobileNumberToUsername = new HashMap<String, String>();
    }

    public String getUsername(String mobileNumber) {
        return mobileNumberToUsername.get(mobileNumber);
    }

    void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        for(Mobile mobile : mobileList) {
            mobileNumberToUsername.put(mobile.getMobileNumber(), mobile.getUsername());
        }
    }

}

и:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"username", "mobileNumber"})
public class Mobile {

    private String username;
    private String mobileNumber;

    @XmlElement(name="Username")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @XmlElement(name="MobileNumber")
    public String getMobileNumber() {
        return mobileNumber;
    }

    public void setMobileNumber(String mobileNumber) {
        this.mobileNumber = mobileNumber;
    }

}

Вы можете проверить это сопоставление, используя документ XML и следующий демонстрационный код:

import java.io.File;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum121/input.xml");
        Details details = (Details) unmarshaller.unmarshal(xml);

        System.out.println(details.getUsername("1234567890"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(details, System.out);
    }

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