我正在使用JAXB在我的基於GWT的應用程序中解析XML文件。的XML看起來像這樣(簡化的例子):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>
我已經定義的類,如下所示:
@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;
}
...
...
}
這是代碼:
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();
}
我需要根據公司名稱獲取聯繫人列表。例如,獲取公司「abc」的所有聯繫人。我可以解析整個XML文件,然後手動過濾記錄。但是如果輸入文件很大,解析我所需要的可能會更有效率。那麼是否可以預先指定標準並僅解析特定記錄?
謝謝。
感謝你的迴應。你可以使用這些方法更簡單的方式來展示(或指向我)示例代碼嗎?對不起,我還是這個東西的新手。 – DFB 2011-05-10 12:56:23
更新了我的答案,儘管Map方法仍然解析整個XML文件,所以它可能不是您要查找的內容。記住要測量各種數據集的性能! – artbristol 2011-05-10 13:20:48
您是否建議通過修改我的地址簿類,解組會將數據轉化爲地圖(實際上這會很棒)?或者我應該創建一個新的類SearchableAddressBook將列表轉換爲映射「之後」解組?謝謝。 – DFB 2011-05-10 13:59:51