【问题标题】:How to create an arrayList of objects from xml?如何从xml创建对象的arrayList?
【发布时间】:2019-09-17 07:36:14
【问题描述】:

我有一个xml文件,结构如下:

 <elements number="3">
     <contact>
       <name>PAUL</name>
       <surname>ONE</surname>
       <code>A1</code>
       <city>NEWYORK</city>
     </contact>
     <contact>
       <name>LAURA</name>
       <surname>TWO</surname>
       <code>A2</code>
       <city>WASHINGTON</city>
     </contact>
     <contact>
       <name>JOHN</name>
       <surname>THREE</surname>
       <code>A3</code>
       <city>BOSTON</city>
     </contact>

我还有一个类Contact,具有namesurnamecodecity 的属性。我正在尝试从 .xml 文件创建对象数组列表 Contact。 我的解决方案是这样的:

private String inputContacts ="inputContacts.xml";

public ArrayList<Contact> readContacts() {
        ArrayList<Contact> contacts = new ArrayList<Contact>();
        int k = 0;
        try {
            xmlif = XMLInputFactory.newInstance();
            xmlr = xmlif.createXMLStreamReader(inputContacts, new FileInputStream(inputContacts)); 

            while (xmlr.hasNext()) {
                 switch (xmlr.getEventType()) {
                 case XMLStreamConstants.START_DOCUMENT: 
                     System.out.println("Start Read Doc " + inputContacts); 
                     break;

                 case XMLStreamConstants.START_ELEMENT: 
                    switch (xmlr.getLocalName()) {
                    case "contact":
                         System.out.println("Tag " + xmlr.getLocalName());
                         Contact p = new Contact();
                         contacts.add(p);
                         k++;
                        break;

                    case "name":
                        contacts.get(k).setName(xmlr.getText());
                        break;

                    case "surname":
                        contacts.get(k).setSurname(xmlr.getText());
                        break;

                    case "code":
                        contacts.get(k).setCode(xmlr.getText());
                        break;

                    case "city":
                        contacts.get(k).setCity(xmlr.getText());
                        break;

                    default:
                        break; 
                     }

                     break;
                 case XMLStreamConstants.END_ELEMENT: 
                     System.out.println("END-Tag " + xmlr.getLocalName()); 

                     break;
                 case XMLStreamConstants.COMMENT:
                    System.out.println("// comment " + xmlr.getText()); 
                     break;
                 case XMLStreamConstants.CHARACTERS: 

                     break;

                 }

                xmlr.next();
            }
        }
        catch (Exception e) {
            System.out.println("Reader initialization error:");
            System.out.println(e.getMessage()); 
            }

        return contacts;
        }

问题是开始读取文件,但在输入文件后立即返回等于null的所有内容。

提前感谢大家!

【问题讨论】:

  • 你一开始就设置了k=0,添加了一个新元素之后再递增,然后尝试用k来寻址这个元素,此时等于1。但是数组是从 0 开始索引的,所以你应该得到 IndexOutOfBoundsException。最初尝试设置 k=-1。
  • 不行
  • 对,你需要使用 xmlr.getElementText() vs getText()
  • @Egor 太简单了。谢谢!效果很好!

标签: java xml object arraylist


【解决方案1】:

您可以为此目的使用 JAXB 库。例如:

使用联系人列表创建根类:

@XmlRootElement(name = "elements")
@XmlAccessorType(XmlAccessType.FIELD)
public class ContactsList {
    @XmlElement(name = "contact")
    private List<Contact> list;
}

以及代表联系人数据的类:

@XmlRootElement(name = "contact")
public class Contact {
    private String name;
    private String surname;   
    private String code;   
    private String city;
}

然后使用Unmarshaller 读取您的 .xml 文件,例如:

public static void main(String[] args) throws JAXBException {
        File file = new File("your-file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(ContactsList.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        ContactsList contacts = (ContactsList) unmarshaller.unmarshal(file);
        for (Contact c: contacts.getList()) {
            System.out.println(c.toString());
        }
}

【讨论】:

  • 有没有没有外部库的方法,但是我已经包含了?
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 2013-09-26
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
相关资源
最近更新 更多