无法使用 XMLEventReader

问题描述

我正在尝试为大 JAXB Unmarshalling 文件执行 XML,因此使用 XMLEventReader 但它没有按预期工作并且没有执行 Unmarshalling

以下是我正在尝试 unmarshal 的 XML 文件

<Customers>
  <Customer>
    <name>BATMAN</name>
    <age>2008</age>
  </Customer>
  <Customer>
    <name>SuperMan</name>
    <age>2022</age>
  </Customer>
</Customers>

以下是将用于 Customer.classunmarshalling

@XmlRootElement(name = "Customer")
@XmlType(name = "Customer",propOrder = {"name","age"})
@XmlAccessorType(XmlAccesstype.FIELD)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Customer {
  private String name;
  private String age;
}

以下是 Main 类,它将 unmarshal 每个 customer 并存储在 customer 字段中,但它返回 null。通常在我希望它向我打印客户信息时。

class Main {

  public static void main(String[] args) throws JAXBException,XMLStreamException,JsonProcessingException {
    final InputStream inputStream = Main.class.getClassLoader().getResourceAsstream("Customer.xml");
    final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    final XMLEventReader streamReader = xmlInputFactory.createXMLEventReader(inputStream);
    final JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

    while (streamReader.hasNext()) {
      final XMLEvent e = streamReader.nextEvent();

      if (e.isstartElement() && ((StartElement) e).getName().getLocalPart().equals("Customer")) {
        System.out.println(((StartElement) e).getName().getLocalPart());
        final Customer customer = unmarshaller.unmarshal(streamReader,Customer.class).getValue();
        System.out.println(customer);
      }
    }
  }
}

我尝试使用 XMLStreamReader 并且效果很好。但我想利用 XMLEventReader peak() 功能。因此,我正在尝试使用 XMLEventReader。 我查看了许多示例,他们提供了类似的示例,但不确定我的案例出了什么问题。

有人能帮我理解这个问题吗?

解决方法

在尝试了几件事之后,我能够让它工作。在这里发布答案,以便将来对某人有用:

class Main {

  public static void main(String[] args) throws JAXBException,XMLStreamException,JsonProcessingException {
    final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("Customer.xml");
    final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    final XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(inputStream);
    final JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

    while (xmlEventReader.peek() != null) {
      XMLEvent event = xmlEventReader.peek();

      if (event.isStartElement() && ((StartElement) event).getName().getLocalPart().equals("Customer")) {
        Customer customer = unmarshaller.unmarshal(xmlEventReader,Customer.class).getValue();
        System.out.println("Normal Customer : " + customer);
      } else {
        xmlEventReader.next();
      }
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...