使用 STAX JAVA 读取 XML 中元素的多个子元素

Read multiple child of Element in XML using STAX JAVA

如何读取 Item 元素的所有子项并将其存储在对象中

这是我的示例 xml 文件

<People>
  <Person>
    <Name>Ben</Name>
    <Items>
      <Item>Pen</Item>
      <Item>Paper</Item>
      <Item>Books</Item>
    </Items>
  </Person>
  <Person>
    <Name>Alex</Name>
    <Items>
      <Item>Pencil</Item>
      <Item>Eraser</Item>
    </Items>
</People>

我用 getter 和 setter 创建了一个 Person 对象

public class Person{ // SAMPLE OBJECT
    private String name; @getters and setters 
    private String item; @getters and setters
}

这是我的方法

  public ArrayList<Person> getPeople(){

        people = new ArrayList<>();        
        Person a = null;        
        if (Files.exists(peoplePath))  // prevent the FileNotFoundException
        {
            // create the XMLInputFactory object
            XMLInputFactory inputFactory = XMLInputFactory.newFactory();
            try
            {
                // create a XMLStreamReader object
                FileReader fileReader =
                    new FileReader(peoplePath.toFile());
                XMLStreamReader reader =
                    inputFactory.createXMLStreamReader(fileReader);

                // read from the file
                while (reader.hasNext())
                {
                    int eventType = reader.getEventType();
                    switch (eventType)
                    {
                        case XMLStreamConstants.START_ELEMENT:
                            String elementName = reader.getLocalName();
                            if (elementName.equals("Person"))
                            {
                                a = new Person();
                            }
                            if (elementName.equals("Name"))
                            {
                                String name = reader.getElementText();
                                a.setName(name);                
                             }
                            
                            if (elementName.equals("Item"))
                            {
                                String item= reader.getElementText();
                                a.setItem(item);
                            }
                            break;
                        case XMLStreamConstants.END_ELEMENT:
                            elementName = reader.getLocalName();
                            if (elementName.equals("Person"))
                            {
                                people.add(a);
                            }
                            break;
                        default:
                            break;
                    }
                    reader.next();
                }
            }
            catch (IOException | XMLStreamException e)
            {
                System.out.println(e);
                return null;
            }
        }
        return people;
    }


此方法显示

亚历克斯

但如果我只使用类似的代码获取项目,它会显示
书籍
橡皮擦

    public static void displayPeople(){
     
        ArrayList<Person> people = personDAO.getPeople();
        People p = null;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < people.size(); i++)
        {
            a = people.get(i);
            sb.append(a.getName());          
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }

我想做这个输出

Ben
    Pen
    Paper
    Book
Alex
    Pencil 
    Eraser

首先,您的 xml 缺少在结束前关闭的 Person 元素。

</Person>

其次,你的Person class并不完全正确。项目应该是一个字符串列表,而不仅仅是一个字符串。

public class Person {
// private keyword is removed for brevity
    String name; 
    List<String> items = new ArrayList<>(); 
}

第三,您的代码需要更新以使用项目列表如下:

if (elementName.equals("Item"))
{
    String item= reader.getElementText();
    a.getItems().add(item);
}

其实我在想: 为什么选择 Stax 而不是 JAXB?您的 XML 模式实际上非常简单,可以使用 JAXB 进行处理。将 XML 对象转换为 Java 对象的样板代码非常少,这意味着使用 JAXB 您的代码将更具可读性和可维护性。只是我的 2 美分。