2011-01-21 2 views
0

Использование JAXB, как я могу развязать этот документ в объектной модели, которая позволит мне запрашивать имя пользователя по мобильному номеру?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> 
+0

Подробнее пожалуйста? – Navi

+1

Нет знака вопроса ... и я не могу сказать, где он будет вписываться в ваш пост. – aioobe

+0

Просмотрите мой блог для примеров JAXB: http://bdoughan.blogspot.com/ –

ответ

1

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

Ваша модель домена будет выглядеть следующим образом:

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); 
    } 

} 
+0

спасибо ... даже плохой пример ... –

+0

shra1 - Я опубликовал рабочий пример. Я думаю, что для этого варианта использования лучше использовать немаршальное событие, чем моя оригинальная идея использования XmlAdapter. –

Смежные вопросы