J'utilise JAXB pour analyser un fichier XML dans mon application basée sur GWT. Le XML ressemble à ceci (un exemple simplifié):Analyse syntaxique JAXB
<addressbook>
<company name="abc">
<contact>
<name>...</name>
<address>...</address>
</contact>
<contact>
<name>...</name>
<address>...</address>
</contact>
<contact>
<name>...</name>
<address>...</address>
</contact>
...
...
</company>
<company name="def">
<contact>
<name>...</name>
<address>...</address>
</contact>
...
...
</company>
...
...
</addressbook>
J'ai défini les classes comme indiqué ci-dessous:
@XmlRootElement(name="addressbook")
public class Addressbook implements Serializable {
private ArrayList<Company> companyList = new ArrayList<Company>();
public Addressbook() {
}
@XmlElement(name = "company")
public ArrayList<Company> getCompanyList() {
return companyList;
}
}
=============================
@XmlRootElement(name="company")
public class Company implements Serializable {
private String name;
private ArrayList<Contact> contactList = new ArrayList<Contact>();
public Company() {
}
@XmlAttribute
public String getName() {
return name;
}
@XmlElement(name = "contact")
public ArrayList<Contact> getContactList() {
return contactList;
}
...
...
}
=============================
@XmlRootElement(name="contact")
public class Contact implements Serializable
{
private String name;
private String address;
public Contact() {
}
@XmlElement
public String getName()
{
return name;
}
@XmlElement
public String getAddress()
{
return address;
}
...
...
}
Voici le code:
try {
JAXBContext jc = JAXBContext.newInstance(Addressbook.class);
Unmarshaller um = jc.createUnmarshaller();
addressbook = (Addressbook) um.unmarshal(new FileReader("ds/addressbook.xml"));
} catch (JAXBException e) {
e.printStackTrace();
}
Je dois obtenir la liste des contacts en fonction du nom de l'entreprise. Par exemple, obtenez tous les contacts pour la société "abc". Je peux analyser le fichier XML entier, puis filtrer manuellement les enregistrements. Mais si le fichier d'entrée est grand, il peut être plus efficace d'analyser uniquement ce dont j'ai besoin. Est-il donc possible de spécifier un critère à l'avance et d'analyser uniquement des enregistrements spécifiques?
Merci.
remerciements pour votre réponse. Pourriez-vous montrer (ou me diriger vers) un exemple de code en utilisant la plus simple de ces approches? Désolé, je suis encore nouveau dans ce domaine. – DFB
Mise à jour de ma réponse, bien que l'approche Map analyse toujours l'ensemble du fichier XML, ce n'est peut-être pas ce que vous cherchez. N'oubliez pas de mesurer la performance sur une variété de jeux de données! – artbristol
Suggérez-vous qu'en modifiant ma classe Addressbook, l'unmarshalling obtiendrait les données dans une carte (ce serait génial, en fait)?Ou devrais-je créer une nouvelle classe SearchableAddressBook pour convertir la liste en une carte "après" unmarshalling? Merci. – DFB