There are 2 ways to solve this issue:
Method-1
Using the package-info file:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Persons xmlns="http://entreprise.uk/ns">
<person>
<firstName>Batman</firstName>
</person>
</Persons>
package-info.java:
@XmlSchema(
elementFormDefault = XmlNsForm.QUALIFIED,
namespace = "http://entreprise.uk/ns",
xmlns = {@XmlNs(prefix = "", namespaceURI = "http://entreprise.uk/ns")})
package stackover;
import jakarta.xml.bind.annotation.XmlNs;
import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;
Persons:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Persons")
@Data
public class Persons {
private Person person;
}
Person:
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String firstName;
}
Main:
public class Main {
public static void main(String[] args) throws JAXBException, XMLStreamException {
final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("students.xml");
final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
final Unmarshaller unmarshaller = JAXBContext.newInstance(Persons.class).createUnmarshaller();
final Persons persons = unmarshaller.unmarshal(xmlStreamReader, Persons.class).getValue();
System.out.println(persons.toString());
Marshaller marshaller = JAXBContext.newInstance(Persons.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(persons, System.out);
}
}
Output:
Persons(person=Person(firstName=Batman))
<Persons xmlns="http://entreprise.uk/ns">
<person>
<firstName>Batman</firstName>
</person>
</Persons>
Method-2
Using the prefix with namespace URI for XML and adding to the root class:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Persons xmlns:ns0="http://entreprise.uk/ns">
<person>
<firstName>Batman</firstName>
</person>
</Persons>
Persons:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Persons", namespace = "http://entreprise.uk/ns")
@Data
public class Persons {
private Person person;
}
Person:
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String firstName;
}
Main:
public class Main {
public static void main(String[] args) throws JAXBException, XMLStreamException {
final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("students.xml");
final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
final Unmarshaller unmarshaller = JAXBContext.newInstance(Persons.class).createUnmarshaller();
final Persons persons = unmarshaller.unmarshal(xmlStreamReader, Persons.class).getValue();
System.out.println(persons.toString());
Marshaller marshaller = JAXBContext.newInstance(Persons.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(persons, System.out);
}
}
Output:
Persons(person=Person(firstName=Batman))
<ns0:Persons xmlns:ns0="http://entreprise.uk/ns">
<person>
<firstName>Batman</firstName>
</person>
</ns0:Persons>