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



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

这是我的示例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>

我用getters和setters 制作了一个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;
}

此方法显示
Ben
Alex

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

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类不是真正正确的。项目应该是一个字符串列表,而不仅仅是一个String。

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美分。

最新更新