无法使用 XMLEventReader 将 XML 解组到我的 class
Unable to unmarshal the XML to my class using the XMLEventReader
我正在尝试对大型 XML
文件执行 JAXB Unmarshalling
,因此使用 XMLEventReader
但它没有按预期工作并且没有执行 Unmarshalling
。
以下是我正在尝试 unmarshal
的 XML 文件:
<Customers>
<Customer>
<name>BATMAN</name>
<age>2008</age>
</Customer>
<Customer>
<name>SuperMan</name>
<age>2022</age>
</Customer>
</Customers>
以下是将用于 unmarshalling
的 Customer.class
:
@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
class,它将 unmarshal
每个 customer
并存储在 customer
字段中,但 returns无效的。通常当我希望它打印客户信息时。
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();
}
}
}
}
我正在尝试对大型 XML
文件执行 JAXB Unmarshalling
,因此使用 XMLEventReader
但它没有按预期工作并且没有执行 Unmarshalling
。
以下是我正在尝试 unmarshal
的 XML 文件:
<Customers>
<Customer>
<name>BATMAN</name>
<age>2008</age>
</Customer>
<Customer>
<name>SuperMan</name>
<age>2022</age>
</Customer>
</Customers>
以下是将用于 unmarshalling
的 Customer.class
:
@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
class,它将 unmarshal
每个 customer
并存储在 customer
字段中,但 returns无效的。通常当我希望它打印客户信息时。
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();
}
}
}
}