Java >> Java tutorial >  >> Tag >> XML

Sådan unmarshal/parser XML-fil ved hjælp af JAXB i Java

Denne side vil gennemgå, hvordan man unmarshaler/parser XML-fil ved hjælp af JAXB i Java. JAXB står for Java Architecture for XML Binding. JAXB bruges til at konvertere XML til objekt og objekt til XML.

Dette eksempel kan også løse dit følgende spørgsmål:

  • Hvordan unmarshalerer du XML i Java?
  • Hvordan læser man XML-fildata ved hjælp af JAXB i Java?
  • Hvordan konverteres XML til et objekt?

Lignende indlæg: Sådan parses XML i Java

Tilføj følgende afhængighed til din pom.xml fil til binding af XML-elementer og attributter i Object.

<dependency>
	<groupId>javax.xml.bind</groupId>
	<artifactId>jaxb-api</artifactId>
	<version>2.3.1</version>
</dependency>

Lad os starte med det faktiske stykke kode. Antag, at vi har nedenstående XML-fil, som indeholder familieoplysninger:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Father name="Kali Ram" age="70" placeOfBirth="Allahabad, India">
	<Son name="Manohar" age="45" placeOfBirth="Lucknow, India">
		<GrandSon name="Pawan" age="30" placeOfBirth="Varanasi, India"/>		
		<GrandSon name="Krishna" age="27" placeOfBirth="Mumbai, India"/>
	</Son>	
	<Son name="Lalchand" age="40" placeOfBirth="Allahabad, India">
		<GrandSon name="Rohit" age="21" placeOfBirth="New Delhi, India"/>
	</Son>	
</Father>

Det første trin vil være at oprette POJO for alle XML-elementer, for ovenstående XML-fil vil vi oprette 3 POJO-klasser under et eller andet hierarki.

Father.java
package org.websparrow.xml.parse;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Father")
@XmlAccessorType(XmlAccessType.FIELD)
public class Father {

	@XmlAttribute(name = "name")
	private String name;
	@XmlAttribute(name = "age")
	private Integer age;
	@XmlAttribute(name = "placeOfBirth")
	private String placeOfBirth;
	@XmlElement(name = "Son")
	private List<Son> sons;

	// Generate Getters and Setters...

	@Override
	public String toString() {
		return "Father [name=" + name + ", age=" + age + ", placeOfBirth=" + placeOfBirth + ", sons=" + sons + "]";
	}
}
Son.java
package org.websparrow.xml.parse;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Son {

	@XmlAttribute(name = "name")
	private String name;
	@XmlAttribute(name = "age")
	private Integer age;
	@XmlAttribute(name = "placeOfBirth")
	private String placeOfBirth;
	@XmlElement(name = "GrandSon")
	private List<GrandSon> grandSons;

	// Generate Getters and Setters...

	@Override
	public String toString() {
		return "Son [name=" + name + ", age=" + age + ", placeOfBirth=" + placeOfBirth + ", grandSons=" + grandSons
				+ "]";
	}
}
GrandSon.java
package org.websparrow.xml.parse;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;

@XmlAccessorType(XmlAccessType.FIELD)
public class GrandSon {

	@XmlAttribute(name = "name")
	private String name;
	@XmlAttribute(name = "age")
	private Integer age;
	@XmlAttribute(name = "placeOfBirth")
	private String placeOfBirth;

	// Generate Getters and Setters...

	@Override
	public String toString() {
		return "GrandSon [name=" + name + ", age=" + age + ", placeOfBirth=" + placeOfBirth + "]";
	}
}

Endelig er POJO'er klar, det andet trin er at oprette JAXBContext-objektet og videregive dit XML-rodelement POJO for at få den nye Instance af JAXBContext.

JAXBContext jaxbContext = JAXBContext.newInstance(Father.class);

Det tredje trin er at oprette Unmarshaller-objekterne og kalde unmarshal-metoden.

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Father father = (Father) unmarshaller.unmarshal(fileInputStream);

Det vil returnere det resulterende indholdstræ. Se det komplette eksempel.

XmlParseUtil.java
package org.websparrow.xml.parse;

import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class XmlParseUtil {

	public static void main(String[] args) {

		JAXBContext jaxbContext;
		String fileLocation = "E:\\file\\family-info.xml";

		try (FileInputStream fileInputStream = new FileInputStream(fileLocation)) {

			System.out.println("******** PARSING START ********");

			jaxbContext = JAXBContext.newInstance(Father.class);

			Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
			Father father = (Father) unmarshaller.unmarshal(fileInputStream);

			System.out.println(father);

			System.out.println("******** PARSING DONE ********");

		} catch (Exception e) {
			System.out.println("******** ERROR: SOMETHING WENT WRONG ********");
			e.printStackTrace();
		}
	}
}

OUTPUT: Det vil give dig nedenstående resultat.

******** PARSING START ********
Father [name=Kali Ram, age=70, placeOfBirth=Allahabad, India, 
	   sons=[
				Son [name=Manohar, age=45, placeOfBirth=Lucknow, India, 
					grandSons=[
								GrandSon [name=Pawan, age=30, placeOfBirth=Varanasi, India],
								GrandSon [name=Krishna, age=27, placeOfBirth=Mumbai, India]]],
				Son [name=Lalchand, age=40, placeOfBirth=Allahabad, India,
					grandSons=[
								GrandSon [name=Rohit, age=21, placeOfBirth=New Delhi, India]]]]]
******** PARSING DONE ********

For kun at hente Son-detaljer, vil din kode være:

father.getSons().stream().forEach(sons -> System.out.println(sons));

Det giver dig kun Søn og GrandSøn detaljer.

Son [name=Manohar, age=45, placeOfBirth=Lucknow, India, 
	grandSons=[
				GrandSon [name=Pawan, age=30, placeOfBirth=Varanasi, India], 
				GrandSon [name=Krishna, age=27, placeOfBirth=Mumbai, India]
			  ]
	]
Son [name=Lalchand, age=40, placeOfBirth=Allahabad, India, 
	grandSons=[
				GrandSon [name=Rohit, age=21, placeOfBirth=New Delhi, India]
			  ]
	]

Og for detaljer om GrandSon:

father.getSons().stream()
					.forEach(sons -> sons.getGrandSons().stream()
							.forEach(grandSons -> System.out.println(grandSons)));
GrandSon [name=Pawan, age=30, placeOfBirth=Varanasi, India]
GrandSon [name=Krishna, age=27, placeOfBirth=Mumbai, India]
GrandSon [name=Rohit, age=21, placeOfBirth=New Delhi, India]

Java tag