我正在使用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